| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -103,6 +103,7 @@ class DelayFile: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        delays = np.zeros((len(circuit.lines), 2, 2, 3))  # dataset last during construction. | 
					 | 
					 | 
					 | 
					        delays = np.zeros((len(circuit.lines), 2, 2, 3))  # dataset last during construction. | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        nonfork_annotations = 0 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        for n1, n2, *delvals in self._interconnects: | 
					 | 
					 | 
					 | 
					        for n1, n2, *delvals in self._interconnects: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            delvals = [d if len(d) > 0 else [0, 0, 0] for d in delvals] | 
					 | 
					 | 
					 | 
					            delvals = [d if len(d) > 0 else [0, 0, 0] for d in delvals] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            if max(max(delvals)) == 0: continue | 
					 | 
					 | 
					 | 
					            if max(max(delvals)) == 0: continue | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -120,19 +121,27 @@ class DelayFile: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                log.warn(f'No line to annotate pin {pn2} of {c2}') | 
					 | 
					 | 
					 | 
					                log.warn(f'No line to annotate pin {pn2} of {c2}') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                continue | 
					 | 
					 | 
					 | 
					                continue | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            f1, f2 = c1.outs[p1].reader, c2.ins[p2].driver  # find the forks between cells. | 
					 | 
					 | 
					 | 
					            f1, f2 = c1.outs[p1].reader, c2.ins[p2].driver  # find the forks between cells. | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            assert f1.kind == '__fork__' | 
					 | 
					 | 
					 | 
					            if f1 == c2 and f2 == c1: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            assert f2.kind == '__fork__' | 
					 | 
					 | 
					 | 
					                nonfork_annotations += 1 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            if f1 != f2:  # at least two forks, make sure f2 is a branchfork connected to f1 | 
					 | 
					 | 
					 | 
					                if nonfork_annotations < 10: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                assert len(f2.outs) == 1 | 
					 | 
					 | 
					 | 
					                    log.warn(f'No fork between {c1.name}/{p1} and {c2.name}/{p2}, using {c2.name}/{p2}') | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                assert f1.outs[f2.ins[0].driver_pin] == f2.ins[0] | 
					 | 
					 | 
					 | 
					                line = c2.ins[p2] | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                line = f2.ins[0] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            elif len(f2.outs) == 1:  # f1==f2, only OK when there is no fanout. | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                line = f2.ins[0] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            else: | 
					 | 
					 | 
					 | 
					            else: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                log.warn(f'No branchfork to annotate interconnect delay {c1.name}/{p1}->{c2.name}/{p2}') | 
					 | 
					 | 
					 | 
					                assert f1.kind == '__fork__' | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                continue | 
					 | 
					 | 
					 | 
					                assert f2.kind == '__fork__' | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                if len(f2.outs) == 1: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                    assert f1 == f2 or f1.outs[f2.ins[0].driver_pin] == f2.ins[0] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                    line = f2.ins[0] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                else: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                    nonfork_annotations += 1 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                    if nonfork_annotations < 10: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                        log.warn(f'No branchfork between {c1.name}/{p1} and {c2.name}/{p2}, using {c2.name}/{p2}') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                    line = c2.ins[p2] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            delays[line, :] = delvals | 
					 | 
					 | 
					 | 
					            delays[line, :] = delvals | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if nonfork_annotations > 0: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					            log.warn(f'{nonfork_annotations} interconnect annotations were moved to gate inputs due to missing forks.') | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        return np.moveaxis(delays, -1, 0) | 
					 | 
					 | 
					 | 
					        return np.moveaxis(delays, -1, 0) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |