@ -10,6 +10,7 @@ from itertools import product
@@ -10,6 +10,7 @@ from itertools import product
from . import bench
class TechLib :
""" Class for standard cell library definitions.
@ -38,11 +39,9 @@ class TechLib:
@@ -38,11 +39,9 @@ class TechLib:
else :
pin_dict [ n . name ] = ( o_idx , True )
o_idx + = 1
has_dff = ' DFF ' in set ( n . kind for n in c . cells . values ( ) )
has_latch = ' LATCH ' in set ( n . kind for n in c . cells . values ( ) )
parts = [ s [ 1 : - 1 ] . split ( ' , ' ) if s [ 0 ] == ' { ' else [ s ] for s in re . split ( r ' ( { [^}]+}) ' , c . name ) if len ( s ) > 0 ]
for name in [ ' ' . join ( item ) for item in product ( * parts ) ] :
self . cells [ name ] = ( c , pin_dict , has_dff , has_latch )
self . cells [ name ] = ( c , pin_dict )
def pin_index ( self , kind , pin ) :
""" Returns a pin list position for a given node kind and pin name. """
@ -50,39 +49,19 @@ class TechLib:
@@ -50,39 +49,19 @@ class TechLib:
assert pin in self . cells [ kind ] [ 1 ] , f ' Unknown pin: { pin } for cell { kind } '
return self . cells [ kind ] [ 1 ] [ pin ] [ 0 ]
def pin_name ( self , kind : str , pos : int , output = False ) - > str :
def pin_name ( self , kind , pos , output = False ) :
""" Returns the pin name for a given node kind, list position, and direction. """
assert kind in self . cells , f ' Unknown cell: { kind } '
for name , ( ppos , isout ) in self . cells [ kind ] [ 1 ] . items ( ) :
if isout == output and ppos == pos :
return name
raise ValueError ( f ' Invalid { " output " if output else " input " } pin position { pos } for cell: { kind } ' )
return None
def pin_is_output ( self , kind , pin ) :
""" Returns True, if given pin name of a node kind is an output. """
assert kind in self . cells , f ' Unknown cell: { kind } '
assert pin in self . cells [ kind ] [ 1 ] , f ' Unknown pin: { pin } for cell { kind } '
return self . cells [ kind ] [ 1 ] [ pin ] [ 1 ]
def is_dff ( self , kind ) :
""" Returns True, if given node kind is a d-flip-flop. """
if kind == ' __fork__ ' : return False
if kind == ' __const0__ ' : return False
if kind == ' __const1__ ' : return False
if kind == ' input ' : return False
if kind == ' output ' : return False
assert kind in self . cells , f ' Unknown cell: { kind } '
return self . cells [ kind ] [ 2 ]
def is_latch ( self , kind ) :
""" Returns True, if given node kind is a latch. """
if kind == ' __fork__ ' : return False
if kind == ' __const0__ ' : return False
if kind == ' __const1__ ' : return False
if kind == ' input ' : return False
if kind == ' output ' : return False
assert kind in self . cells , f ' Unknown cell: { kind } '
return self . cells [ kind ] [ 3 ]
KYUPY = TechLib ( r """
@ -120,7 +99,6 @@ AOI211 input(i0,i1,i2,i3) output(o) o=AOI211(i0,i1,i2,i3) ;
@@ -120,7 +99,6 @@ AOI211 input(i0,i1,i2,i3) output(o) o=AOI211(i0,i1,i2,i3) ;
OAI211 input ( i0 , i1 , i2 , i3 ) output ( o ) o = OAI211 ( i0 , i1 , i2 , i3 ) ;
MUX21 input ( i0 , i1 , i2 ) output ( o ) o = MUX21 ( i0 , i1 , i2 ) ;
DFF input ( D , CLK ) output ( Q ) Q = DFF ( D , CLK ) ;
LATCH input ( D , CLK ) output ( Q ) Q = LATCH ( D , CLK ) ;
""" )
""" A synthetic library of all KyuPy simulation primitives.
"""
@ -150,7 +128,7 @@ OAI21X1 input(A0,A1,B0) output(Y) Y=OAI21(A0,A1,B0) ;
@@ -150,7 +128,7 @@ OAI21X1 input(A0,A1,B0) output(Y) Y=OAI21(A0,A1,B0) ;
OAI22X1 input ( A0 , A1 , B0 , B1 ) output ( Y ) Y = OAI22 ( A0 , A1 , B0 , B1 ) ;
OAI33X1 input ( A0 , A1 , A2 , B0 , B1 , B2 ) output ( Y ) AA = OR2 ( A0 , A1 ) BB = OR2 ( B0 , B1 ) Y = OAI22 ( AA , A2 , BB , B2 ) ;
ADDFX1 input ( A , B , CI ) output ( CO , S ) AB = XOR2 ( A , B ) CO = XOR2 ( AB , CI ) S = AO22 ( AB , CI , A , B ) ;
ADDHX1 input ( A , B ) output ( CO , S ) CO = AND 2( A , B ) S = XOR 2( A , B ) ;
ADDHX1 input ( A , B ) output ( CO , S ) CO = XOR 2( A , B ) S = AND 2( A , B ) ;
DFFX1 input ( CK , D ) output ( Q , QN ) Q = DFF ( D , CK ) QN = INV1 ( Q ) ;
DFFSRX1 input ( CK , D , RN , SN ) output ( Q , QN ) DR = AND2 ( D , RN ) SET = INV1 ( SN ) DRS = OR2 ( DR , SET ) Q = DFF ( DRS , CK ) QN = INV1 ( Q ) ;
@ -194,7 +172,7 @@ XNOR2_X1 input(A1,A2) output(ZN) ZN=XNOR2(A1,A2) ;
@@ -194,7 +172,7 @@ XNOR2_X1 input(A1,A2) output(ZN) ZN=XNOR2(A1,A2) ;
MUX2_X1 input ( I0 , I1 , S ) output ( Z ) Z = MUX21 ( I0 , I1 , S ) ;
HA_X1 input ( A , B ) output ( CO , S ) CO = AND 2( A , B ) S = XOR 2( A , B ) ;
HA_X1 input ( A , B ) output ( CO , S ) CO = XOR 2( A , B ) S = AND 2( A , B ) ;
FA_X1 input ( A , B , CI ) output ( CO , S ) AB = XOR2 ( A , B ) CO = XOR2 ( AB , CI ) S = AO22 ( CI , A , B ) ;
AOI21_X { 1 , 2 } input ( A1 , A2 , B ) output ( ZN ) ZN = AOI21 ( A1 , A2 , B ) ;
@ -247,7 +225,7 @@ XNOR2_X{1,2} input(A,B) output(ZN) ZN=XNOR2(A,B) ;
@@ -247,7 +225,7 @@ XNOR2_X{1,2} input(A,B) output(ZN) ZN=XNOR2(A,B) ;
MUX2_X { 1 , 2 } input ( A , B , S ) output ( Z ) Z = MUX21 ( A , B , S ) ;
HA_X1 input ( A , B ) output ( CO , S ) CO = AND 2( A , B ) S = XOR 2( A , B ) ;
HA_X1 input ( A , B ) output ( CO , S ) CO = XOR 2( A , B ) S = AND 2( A , B ) ;
FA_X1 input ( A , B , CI ) output ( CO , S ) AB = XOR2 ( A , B ) CO = XOR2 ( AB , CI ) S = AO22 ( CI , A , B ) ;
AOI21_X { 1 , 2 , 4 } input ( A , B1 , B2 ) output ( ZN ) ZN = AOI21 ( B1 , B2 , A ) ;
@ -362,7 +340,7 @@ MUX41X{1,2}$ input(A1,A2,A3,A4,S0,S1) output(Y) A=MUX21(A1,A2,S0) B=MUX21(A3,A4,
@@ -362,7 +340,7 @@ MUX41X{1,2}$ input(A1,A2,A3,A4,S0,S1) output(Y) A=MUX21(A1,A2,S0) B=MUX21(A3,A4,
DEC24X { 1 , 2 } $ input ( A0 , A1 ) output ( Y0 , Y1 , Y2 , Y3 ) A0B = INV1 ( A0 ) A1B = INV1 ( A1 ) Y0 = NOR2 ( A0 , A1 ) Y1 = AND ( A0 , A1B ) Y2 = AND ( A0B , A1 ) Y3 = AND ( A0 , A1 ) ;
FADDX { 1 , 2 } $ input ( A , B , CI ) output ( S , CO ) AB = XOR2 ( A , B ) CO = XOR2 ( AB , CI ) S = AO22 ( AB , CI , A , B ) ;
HADDX { 1 , 2 } $ input ( A0 , B0 ) output ( SO , C1 ) C1 = AND 2( A0 , B0 ) SO = XOR 2( A0 , B0 ) ;
HADDX { 1 , 2 } $ input ( A0 , B0 ) output ( SO , C1 ) C1 = XOR 2( A0 , B0 ) SO = AND 2( A0 , B0 ) ;
{ , AO } DFFARX { 1 , 2 } $ input ( D , CLK , RSTB ) output ( Q , QN ) DR = AND2 ( D , RSTB ) Q = DFF ( DR , CLK ) QN = INV1 ( Q ) ;
DFFASRX { 1 , 2 } $ input ( D , CLK , RSTB , SETB ) output ( Q , QN ) DR = AND2 ( D , RSTB ) SET = INV1 ( SETB ) DRS = OR2 ( DR , SET ) Q = DFF ( DRS , CLK ) QN = INV1 ( Q ) ;
@ -452,7 +430,7 @@ MUX41X{1,2}$ input(IN1,IN2,IN3,IN4,S0,S1) output(Q) A=MUX21(IN1,IN2,S0) B=MUX21(
@@ -452,7 +430,7 @@ MUX41X{1,2}$ input(IN1,IN2,IN3,IN4,S0,S1) output(Q) A=MUX21(IN1,IN2,S0) B=MUX21(
DEC24X { 1 , 2 } $ input ( IN1 , IN2 ) output ( Q0 , Q1 , Q2 , Q3 ) IN1B = INV1 ( IN1 ) IN2B = INV1 ( IN2 ) Q0 = NOR2 ( IN1 , IN2 ) Q1 = AND ( IN1 , IN2B ) Q2 = AND ( IN1B , IN2 ) Q3 = AND ( IN1 , IN2 ) ;
FADDX { 1 , 2 } $ input ( A , B , CI ) output ( S , CO ) AB = XOR2 ( A , B ) CO = XOR2 ( AB , CI ) S = AO22 ( AB , CI , A , B ) ;
HADDX { 1 , 2 } $ input ( A0 , B0 ) output ( SO , C1 ) C1 = AND 2( A0 , B0 ) SO = XOR 2( A0 , B0 ) ;
HADDX { 1 , 2 } $ input ( A0 , B0 ) output ( SO , C1 ) C1 = XOR 2( A0 , B0 ) SO = AND 2( A0 , B0 ) ;
{ , AO } DFFARX { 1 , 2 } $ input ( D , CLK , RSTB ) output ( Q , QN ) DR = AND2 ( D , RSTB ) Q = DFF ( DR , CLK ) QN = INV1 ( Q ) ;
DFFASRX { 1 , 2 } $ input ( D , CLK , RSTB , SETB ) output ( Q , QN ) DR = AND2 ( D , RSTB ) SET = INV1 ( SETB ) DRS = OR2 ( DR , SET ) Q = DFF ( DRS , CLK ) QN = INV1 ( Q ) ;
@ -472,196 +450,3 @@ LATCHX{1,2}$ input(D,CLK) output(Q,QN) Q=LATCH(D,CLK) QN=INV1(Q) ;
@@ -472,196 +450,3 @@ LATCHX{1,2}$ input(D,CLK) output(Q,QN) Q=LATCH(D,CLK) QN=INV1(Q) ;
""" The SAED 90nm educational technology library.
It defines all cells except : negative - edge flip - flops , tri - state , latches , clock gating , level shifters
"""
SKY130 = TechLib ( r """
$ decap_ { 3 , 4 , 6 , 8 , 12 } ;
$ fill_ { 1 , 2 , 4 , 8 } ;
$ tap_ { 1 , 2 } ;
$ tapvgnd_1 ;
$ tapvgnd2_1 ;
$ tapvpwrvgnd_1 ;
$ lpflow_decapkapwr_ { 3 , 4 , 6 , 8 , 12 } ;
$ lpflow_bleeder_1 input ( SHORT ) ;
$ conb_1 output ( HI , LO ) HI = __const1__ ( ) LO = __const0__ ( ) ;
$ macro_sparecell output ( LO ) LO = __const0__ ( ) ;
$ diode_2 input ( DIODE ) ;
$ probe_p_8 input ( A ) output ( X ) X = BUF1 ( A ) ;
$ probec_p_8 input ( A ) output ( X ) X = BUF1 ( A ) ;
$ inv_ { 1 , 2 , 4 , 6 , 8 , 12 , 16 } input ( A ) output ( Y ) Y = INV1 ( A ) ;
$ buf_ { 1 , 2 , 4 , 6 , 8 , 12 , 16 } input ( A ) output ( X ) X = BUF1 ( A ) ;
$ bufbuf_ { 8 , 16 } input ( A ) output ( X ) X = BUF1 ( A ) ;
$ bufinv_ { 8 , 16 } input ( A ) output ( Y ) Y = INV1 ( A ) ;
$ clkbuf_ { 1 , 2 , 4 , 8 , 16 } input ( A ) output ( X ) X = BUF1 ( A ) ;
$ clkinv_ { 1 , 2 , 4 , 8 , 16 } input ( A ) output ( Y ) Y = INV1 ( A ) ;
$ clkinvlp_ { 2 , 4 } input ( A ) output ( Y ) Y = INV1 ( A ) ;
$ clkdlybuf4s15_ { 1 , 2 } input ( A ) output ( X ) X = BUF1 ( A ) ;
$ clkdlybuf4s18_ { 1 , 2 } input ( A ) output ( X ) X = BUF1 ( A ) ;
$ clkdlybuf4s25_ { 1 , 2 } input ( A ) output ( X ) X = BUF1 ( A ) ;
$ clkdlybuf4s50_ { 1 , 2 } input ( A ) output ( X ) X = BUF1 ( A ) ;
$ dlygate4sd1_1 input ( A ) output ( X ) X = BUF1 ( A ) ;
$ dlygate4sd2_1 input ( A ) output ( X ) X = BUF1 ( A ) ;
$ dlygate4sd3_1 input ( A ) output ( X ) X = BUF1 ( A ) ;
$ dlymetal6s2s_1 input ( A ) output ( X ) X = BUF1 ( A ) ;
$ dlymetal6s4s_1 input ( A ) output ( X ) X = BUF1 ( A ) ;
$ dlymetal6s6s_1 input ( A ) output ( X ) X = BUF1 ( A ) ;
$ lpflow_clkbufkapwr_ { 1 , 2 , 4 , 8 , 16 } input ( A ) output ( X ) X = BUF1 ( A ) ;
$ lpflow_clkinvkapwr_ { 1 , 2 , 4 , 8 , 16 } input ( A ) output ( Y ) Y = INV1 ( A ) ;
$ lpflow_lsbuf_lh_hl_isowell_tap_ { 1 , 2 , 4 } input ( A ) output ( X ) X = BUF1 ( A ) ;
$ lpflow_lsbuf_lh_isowell_4 input ( A ) output ( X ) X = BUF1 ( A ) ;
$ lpflow_lsbuf_lh_isowell_tap_ { 1 , 2 , 4 } input ( A ) output ( X ) X = BUF1 ( A ) ;
$ and2_ { 0 , 1 , 2 , 4 } input ( A , B ) output ( X ) X = AND2 ( A , B ) ;
$ and2b_ { 1 , 2 , 4 } input ( A_N , B ) output ( X ) AN = INV1 ( A_N ) X = AND2 ( AN , B ) ;
$ and3_ { 1 , 2 , 4 } input ( A , B , C ) output ( X ) X = AND3 ( A , B , C ) ;
$ and3b_ { 1 , 2 , 4 } input ( A_N , B , C ) output ( X ) AN = INV1 ( A_N ) X = AND3 ( AN , B , C ) ;
$ and4_ { 1 , 2 , 4 } input ( A , B , C , D ) output ( X ) X = AND4 ( A , B , C , D ) ;
$ and4b_ { 1 , 2 , 4 } input ( A_N , B , C , D ) output ( X ) AN = INV1 ( A_N ) X = AND4 ( AN , B , C , D ) ;
$ and4bb_ { 1 , 2 , 4 } input ( A_N , B_N , C , D ) output ( X ) AN = INV1 ( A_N ) BN = INV1 ( B_N ) X = AND4 ( AN , BN , C , D ) ;
$ or2_ { 0 , 1 , 2 , 4 } input ( A , B ) output ( X ) X = OR2 ( A , B ) ;
$ or2b_ { 1 , 2 , 4 } input ( A , B_N ) output ( X ) BN = INV1 ( B_N ) X = OR2 ( A , BN ) ;
$ or3_ { 1 , 2 , 4 } input ( A , B , C ) output ( X ) X = OR3 ( A , B , C ) ;
$ or3b_ { 1 , 2 , 4 } input ( A , B , C_N ) output ( X ) CN = INV1 ( C_N ) X = OR3 ( A , B , CN ) ;
$ or4_ { 1 , 2 , 4 } input ( A , B , C , D ) output ( X ) X = OR4 ( A , B , C , D ) ;
$ or4b_ { 1 , 2 , 4 } input ( A , B , C , D_N ) output ( X ) DN = INV1 ( D_N ) X = OR4 ( A , B , C , DN ) ;
$ or4bb_ { 1 , 2 , 4 } input ( A , B , C_N , D_N ) output ( X ) CN = INV1 ( C_N ) DN = INV1 ( D_N ) X = OR4 ( A , B , CN , DN ) ;
$ nand2_ { 1 , 2 , 4 , 8 } input ( A , B ) output ( Y ) Y = NAND2 ( A , B ) ;
$ nand2b_ { 1 , 2 , 4 } input ( A_N , B ) output ( Y ) AN = INV1 ( A_N ) Y = NAND2 ( AN , B ) ;
$ nand3_ { 1 , 2 , 4 } input ( A , B , C ) output ( Y ) Y = NAND3 ( A , B , C ) ;
$ nand3b_ { 1 , 2 , 4 } input ( A_N , B , C ) output ( Y ) AN = INV1 ( A_N ) Y = NAND3 ( AN , B , C ) ;
$ nand4_ { 1 , 2 , 4 } input ( A , B , C , D ) output ( Y ) Y = NAND4 ( A , B , C , D ) ;
$ nand4b_ { 1 , 2 , 4 } input ( A_N , B , C , D ) output ( Y ) AN = INV1 ( A_N ) Y = NAND4 ( AN , B , C , D ) ;
$ nand4bb_ { 1 , 2 , 4 } input ( A_N , B_N , C , D ) output ( Y ) AN = INV1 ( A_N ) BN = INV1 ( B_N ) Y = NAND4 ( AN , BN , C , D ) ;
$ nor2_ { 1 , 2 , 4 , 8 } input ( A , B ) output ( Y ) Y = NOR2 ( A , B ) ;
$ nor2b_ { 1 , 2 , 4 } input ( A , B_N ) output ( Y ) BN = INV1 ( B_N ) Y = NOR2 ( A , BN ) ;
$ nor3_ { 1 , 2 , 4 } input ( A , B , C ) output ( Y ) Y = NOR3 ( A , B , C ) ;
$ nor3b_ { 1 , 2 , 4 } input ( A , B , C_N ) output ( Y ) CN = INV1 ( C_N ) Y = NOR3 ( A , B , CN ) ;
$ nor4_ { 1 , 2 , 4 } input ( A , B , C , D ) output ( Y ) Y = NOR4 ( A , B , C , D ) ;
$ nor4b_ { 1 , 2 , 4 } input ( A , B , C , D_N ) output ( Y ) DN = INV1 ( D_N ) Y = NOR4 ( A , B , C , DN ) ;
$ nor4bb_ { 1 , 2 , 4 } input ( A , B , C_N , D_N ) output ( Y ) CN = INV1 ( C_N ) DN = INV1 ( D_N ) Y = NOR4 ( A , B , CN , DN ) ;
$ xor2_ { 1 , 2 , 4 } input ( A , B ) output ( X ) X = XOR2 ( A , B ) ;
$ xor3_ { 1 , 2 , 4 } input ( A , B , C ) output ( X ) X = XOR3 ( A , B , C ) ;
$ xnor2_ { 1 , 2 , 4 } input ( A , B ) output ( Y ) Y = XNOR2 ( A , B ) ;
$ xnor3_ { 1 , 2 , 4 } input ( A , B , C ) output ( X ) X = XNOR3 ( A , B , C ) ;
$ maj3_ { 1 , 2 , 4 } input ( A , B , C ) output ( X ) AB = AND2 ( A , B ) BC = AND2 ( B , C ) AC = AND2 ( A , C ) X = OR3 ( AB , BC , AC ) ;
$ mux2_ { 1 , 2 , 4 , 8 } input ( A0 , A1 , S ) output ( X ) X = MUX21 ( A0 , A1 , S ) ;
$ mux2i_ { 1 , 2 , 4 } input ( A0 , A1 , S ) output ( Y ) M = MUX21 ( A0 , A1 , S ) Y = INV1 ( M ) ;
$ mux4_ { 1 , 2 , 4 } input ( A0 , A1 , A2 , A3 , S0 , S1 ) output ( X ) M0 = MUX21 ( A0 , A1 , S0 ) M1 = MUX21 ( A2 , A3 , S0 ) X = MUX21 ( M0 , M1 , S1 ) ;
$ ha_ { 1 , 2 , 4 } input ( A , B ) output ( COUT , SUM ) SUM = XOR2 ( A , B ) COUT = AND2 ( A , B ) ;
$ fa_ { 1 , 2 , 4 } input ( A , B , CIN ) output ( COUT , SUM ) AB = XOR2 ( A , B ) SUM = XOR2 ( AB , CIN ) COUT = AO22 ( A , B , AB , CIN ) ;
$ fah_1 input ( A , B , CI ) output ( COUT , SUM ) AB = XOR2 ( A , B ) SUM = XOR2 ( AB , CI ) COUT = AO22 ( A , B , AB , CI ) ;
$ fahcin_1 input ( A , B , CIN ) output ( COUT , SUM ) AB = XOR2 ( A , B ) SUM = XOR2 ( AB , CIN ) COUT = AO22 ( A , B , AB , CIN ) ;
$ fahcon_1 input ( A , B , CI ) output ( COUT_N , SUM ) AB = XOR2 ( A , B ) SUM = XOR2 ( AB , CI ) T = AO22 ( A , B , AB , CI ) COUT_N = INV1 ( T ) ;
$ a21o_ { 1 , 2 , 4 } input ( A1 , A2 , B1 ) output ( X ) X = AO21 ( A1 , A2 , B1 ) ;
$ a21bo_ { 1 , 2 , 4 } input ( A1 , A2 , B1_N ) output ( X ) BN = INV1 ( B1_N ) X = AO21 ( A1 , A2 , BN ) ;
$ a22o_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , B2 ) output ( X ) X = AO22 ( A1 , A2 , B1 , B2 ) ;
$ a2bb2o_ { 1 , 2 , 4 } input ( A1_N , A2_N , B1 , B2 ) output ( X ) AN1 = INV1 ( A1_N ) AN2 = INV1 ( A2_N ) X = AO22 ( AN1 , AN2 , B1 , B2 ) ;
$ a211o_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , C1 ) output ( X ) X = AO211 ( A1 , A2 , B1 , C1 ) ;
$ a221o_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , B2 , C1 ) output ( X ) T = AO22 ( A1 , A2 , B1 , B2 ) X = OR2 ( T , C1 ) ;
$ a31o_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 ) output ( X ) AA = AND3 ( A1 , A2 , A3 ) X = OR2 ( AA , B1 ) ;
$ a311o_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 , C1 ) output ( X ) T = AND2 ( A1 , A2 ) X = AO211 ( T , A3 , B1 , C1 ) ;
$ a32o_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 , B2 ) output ( X ) T = AND2 ( A1 , A2 ) X = AO22 ( T , A3 , B1 , B2 ) ;
$ a41o_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , A4 , B1 ) output ( X ) T1 = AND2 ( A1 , A2 ) T2 = AND2 ( T1 , A3 ) X = AO21 ( T2 , A4 , B1 ) ;
$ a2111o_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , C1 , D1 ) output ( X ) T = AO211 ( A1 , A2 , B1 , C1 ) X = OR2 ( T , D1 ) ;
$ a21oi_ { 1 , 2 , 4 } input ( A1 , A2 , B1 ) output ( Y ) Y = AOI21 ( A1 , A2 , B1 ) ;
$ a21boi_ { 0 , 1 , 2 , 4 } input ( A1 , A2 , B1_N ) output ( Y ) BN = INV1 ( B1_N ) Y = AOI21 ( A1 , A2 , BN ) ;
$ a22oi_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , B2 ) output ( Y ) Y = AOI22 ( A1 , A2 , B1 , B2 ) ;
$ a2bb2oi_ { 1 , 2 , 4 } input ( A1_N , A2_N , B1 , B2 ) output ( Y ) AN1 = INV1 ( A1_N ) AN2 = INV1 ( A2_N ) Y = AOI22 ( AN1 , AN2 , B1 , B2 ) ;
$ a211oi_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , C1 ) output ( Y ) Y = AOI211 ( A1 , A2 , B1 , C1 ) ;
$ a221oi_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , B2 , C1 ) output ( Y ) T = AO22 ( A1 , A2 , B1 , B2 ) Y = NOR2 ( T , C1 ) ;
$ a222oi_1 input ( A1 , A2 , B1 , B2 , C1 , C2 ) output ( Y ) AB = AO22 ( A1 , A2 , B1 , B2 ) Y = AOI21 ( C1 , C2 , AB ) ;
$ a31oi_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 ) output ( Y ) AA = AND3 ( A1 , A2 , A3 ) Y = NOR2 ( AA , B1 ) ;
$ a311oi_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 , C1 ) output ( Y ) T = AND2 ( A1 , A2 ) Y = AOI211 ( T , A3 , B1 , C1 ) ;
$ a32oi_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 , B2 ) output ( Y ) T = AND2 ( A1 , A2 ) Y = AOI22 ( T , A3 , B1 , B2 ) ;
$ a41oi_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , A4 , B1 ) output ( Y ) T1 = AND2 ( A1 , A2 ) T2 = AND2 ( T1 , A3 ) Y = AOI21 ( T2 , A4 , B1 ) ;
$ a2111oi_ { 0 , 1 , 2 , 4 } input ( A1 , A2 , B1 , C1 , D1 ) output ( Y ) T = AO211 ( A1 , A2 , B1 , C1 ) Y = NOR2 ( T , D1 ) ;
$ o21a_ { 1 , 2 , 4 } input ( A1 , A2 , B1 ) output ( X ) X = OA21 ( A1 , A2 , B1 ) ;
$ o21ba_ { 1 , 2 , 4 } input ( A1 , A2 , B1_N ) output ( X ) BN = INV1 ( B1_N ) X = OA21 ( A1 , A2 , BN ) ;
$ o22a_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , B2 ) output ( X ) X = OA22 ( A1 , A2 , B1 , B2 ) ;
$ o2bb2a_ { 1 , 2 , 4 } input ( A1_N , A2_N , B1 , B2 ) output ( X ) T = NAND2 ( A1_N , A2_N ) X = OA21 ( B1 , B2 , T ) ;
$ o211a_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , C1 ) output ( X ) X = OA211 ( A1 , A2 , B1 , C1 ) ;
$ o221a_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , B2 , C1 ) output ( X ) T = OA22 ( A1 , A2 , B1 , B2 ) X = AND2 ( T , C1 ) ;
$ o31a_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 ) output ( X ) T = OR3 ( A1 , A2 , A3 ) X = AND2 ( T , B1 ) ;
$ o311a_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 , C1 ) output ( X ) T = OR2 ( A1 , A2 ) X = OA211 ( T , A3 , B1 , C1 ) ;
$ o32a_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 , B2 ) output ( X ) T = OR3 ( A1 , A2 , A3 ) X = OA21 ( B1 , B2 , T ) ;
$ o41a_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , A4 , B1 ) output ( X ) T = OR4 ( A1 , A2 , A3 , A4 ) X = AND2 ( T , B1 ) ;
$ o2111a_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , C1 , D1 ) output ( X ) T = OA211 ( A1 , A2 , B1 , C1 ) X = AND2 ( T , D1 ) ;
$ o21ai_ { 0 , 1 , 2 , 4 } input ( A1 , A2 , B1 ) output ( Y ) Y = OAI21 ( A1 , A2 , B1 ) ;
$ o21bai_ { 1 , 2 , 4 } input ( A1 , A2 , B1_N ) output ( Y ) BN = INV1 ( B1_N ) Y = OAI21 ( A1 , A2 , BN ) ;
$ o22ai_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , B2 ) output ( Y ) Y = OAI22 ( A1 , A2 , B1 , B2 ) ;
$ o2bb2ai_ { 1 , 2 , 4 } input ( A1_N , A2_N , B1 , B2 ) output ( Y ) T = NAND2 ( A1_N , A2_N ) Y = OAI21 ( B1 , B2 , T ) ;
$ o211ai_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , C1 ) output ( Y ) Y = OAI211 ( A1 , A2 , B1 , C1 ) ;
$ o221ai_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , B2 , C1 ) output ( Y ) T = OA22 ( A1 , A2 , B1 , B2 ) Y = NAND2 ( T , C1 ) ;
$ o31ai_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 ) output ( Y ) T = OR3 ( A1 , A2 , A3 ) Y = NAND2 ( T , B1 ) ;
$ o311ai_ { 0 , 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 , C1 ) output ( Y ) T = OR2 ( A1 , A2 ) Y = OAI211 ( T , A3 , B1 , C1 ) ;
$ o32ai_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , B1 , B2 ) output ( Y ) T = OR3 ( A1 , A2 , A3 ) Y = OAI21 ( B1 , B2 , T ) ;
$ o41ai_ { 1 , 2 , 4 } input ( A1 , A2 , A3 , A4 , B1 ) output ( Y ) T = OR4 ( A1 , A2 , A3 , A4 ) Y = NAND2 ( T , B1 ) ;
$ o2111ai_ { 1 , 2 , 4 } input ( A1 , A2 , B1 , C1 , D1 ) output ( Y ) T = OA211 ( A1 , A2 , B1 , C1 ) Y = NAND2 ( T , D1 ) ;
$ dfxtp_ { 1 , 2 , 4 } input ( CLK , D ) output ( Q ) Q = DFF ( D , CLK ) ;
$ dfxbp_ { 1 , 2 } input ( CLK , D ) output ( Q , Q_N ) Q = DFF ( D , CLK ) Q_N = INV1 ( Q ) ;
$ dfrtp_ { 1 , 2 , 4 } input ( CLK , D , RESET_B ) output ( Q ) DR = AND2 ( D , RESET_B ) Q = DFF ( DR , CLK ) ;
$ dfrbp_ { 1 , 2 } input ( CLK , D , RESET_B ) output ( Q , Q_N ) DR = AND2 ( D , RESET_B ) Q = DFF ( DR , CLK ) Q_N = INV1 ( Q ) ;
$ dfstp_ { 1 , 2 , 4 } input ( CLK , D , SET_B ) output ( Q ) S = INV1 ( SET_B ) DS = OR2 ( D , S ) Q = DFF ( DS , CLK ) ;
$ dfsbp_ { 1 , 2 } input ( CLK , D , SET_B ) output ( Q , Q_N ) S = INV1 ( SET_B ) DS = OR2 ( D , S ) Q = DFF ( DS , CLK ) Q_N = INV1 ( Q ) ;
$ dfbbp_1 input ( CLK , D , SET_B , RESET_B ) output ( Q , Q_N ) DR = AND2 ( D , RESET_B ) S = INV1 ( SET_B ) DRS = OR2 ( DR , S ) Q = DFF ( DRS , CLK ) Q_N = INV1 ( Q ) ;
$ dfrtn_1 input ( CLK_N , D , RESET_B ) output ( Q ) CLKN = INV1 ( CLK_N ) DR = AND2 ( D , RESET_B ) Q = DFF ( DR , CLKN ) ;
$ dfbbn_ { 1 , 2 } input ( CLK_N , D , SET_B , RESET_B ) output ( Q , Q_N ) CLKN = INV1 ( CLK_N ) DR = AND2 ( D , RESET_B ) S = INV1 ( SET_B ) DRS = OR2 ( DR , S ) Q = DFF ( DRS , CLKN ) Q_N = INV1 ( Q ) ;
$ sdfxtp_ { 1 , 2 , 4 } input ( CLK , D , SCD , SCE ) output ( Q ) DI = MUX21 ( D , SCD , SCE ) Q = DFF ( DI , CLK ) ;
$ sdfxbp_ { 1 , 2 } input ( CLK , D , SCD , SCE ) output ( Q , Q_N ) DI = MUX21 ( D , SCD , SCE ) Q = DFF ( DI , CLK ) Q_N = INV1 ( Q ) ;
$ sdfrtp_ { 1 , 2 , 4 } input ( CLK , D , SCD , SCE , RESET_B ) output ( Q ) DR = AND2 ( D , RESET_B ) DI = MUX21 ( DR , SCD , SCE ) Q = DFF ( DI , CLK ) ;
$ sdfrbp_ { 1 , 2 } input ( CLK , D , SCD , SCE , RESET_B ) output ( Q , Q_N ) DR = AND2 ( D , RESET_B ) DI = MUX21 ( DR , SCD , SCE ) Q = DFF ( DI , CLK ) Q_N = INV1 ( Q ) ;
$ sdfstp_ { 1 , 2 , 4 } input ( CLK , D , SCD , SCE , SET_B ) output ( Q ) S = INV1 ( SET_B ) DS = OR2 ( D , S ) DI = MUX21 ( DS , SCD , SCE ) Q = DFF ( DI , CLK ) ;
$ sdfsbp_ { 1 , 2 } input ( CLK , D , SCD , SCE , SET_B ) output ( Q , Q_N ) S = INV1 ( SET_B ) DS = OR2 ( D , S ) DI = MUX21 ( DS , SCD , SCE ) Q = DFF ( DI , CLK ) Q_N = INV1 ( Q ) ;
$ sdfbbp_1 input ( CLK , D , SCD , SCE , SET_B , RESET_B ) output ( Q , Q_N ) DR = AND2 ( D , RESET_B ) S = INV1 ( SET_B ) DRS = OR2 ( DR , S ) DI = MUX21 ( DRS , SCD , SCE ) Q = DFF ( DI , CLK ) Q_N = INV1 ( Q ) ;
$ sdfrtn_1 input ( CLK_N , D , SCD , SCE , RESET_B ) output ( Q ) CLKN = INV1 ( CLK_N ) DR = AND2 ( D , RESET_B ) DI = MUX21 ( DR , SCD , SCE ) Q = DFF ( DI , CLKN ) ;
$ sdfbbn_ { 1 , 2 } input ( CLK_N , D , SCD , SCE , SET_B , RESET_B ) output ( Q , Q_N ) CLKN = INV1 ( CLK_N ) DR = AND2 ( D , RESET_B ) S = INV1 ( SET_B ) DRS = OR2 ( DR , S ) DI = MUX21 ( DRS , SCD , SCE ) Q = DFF ( DI , CLKN ) Q_N = INV1 ( Q ) ;
$ edfxtp_1 input ( CLK , D , DE ) output ( Q ) GCK = AND2 ( CLK , DE ) Q = DFF ( D , GCK ) ;
$ edfxbp_1 input ( CLK , D , DE ) output ( Q , Q_N ) GCK = AND2 ( CLK , DE ) Q = DFF ( D , GCK ) Q_N = INV1 ( Q ) ;
$ sedfxtp_ { 1 , 2 , 4 } input ( CLK , D , DE , SCD , SCE ) output ( Q ) DI = MUX21 ( D , SCD , SCE ) GCK = AND2 ( CLK , DE ) Q = DFF ( DI , GCK ) ;
$ sedfxbp_ { 1 , 2 } input ( CLK , D , DE , SCD , SCE ) output ( Q , Q_N ) DI = MUX21 ( D , SCD , SCE ) GCK = AND2 ( CLK , DE ) Q = DFF ( DI , GCK ) Q_N = INV1 ( Q ) ;
$ dlxtp_1 input ( D , GATE ) output ( Q ) Q = LATCH ( D , GATE ) ;
$ dlxtn_ { 1 , 2 , 4 } input ( D , GATE_N ) output ( Q ) GN = INV1 ( GATE_N ) Q = LATCH ( D , GN ) ;
$ dlxbp_1 input ( D , GATE ) output ( Q , Q_N ) Q = LATCH ( D , GATE ) Q_N = INV1 ( Q ) ;
$ dlxbn_ { 1 , 2 } input ( D , GATE_N ) output ( Q , Q_N ) GN = INV1 ( GATE_N ) Q = LATCH ( D , GN ) Q_N = INV1 ( Q ) ;
$ dlrtp_ { 1 , 2 , 4 } input ( D , GATE , RESET_B ) output ( Q ) DR = AND2 ( D , RESET_B ) Q = LATCH ( DR , GATE ) ;
$ dlrtn_ { 1 , 2 , 4 } input ( D , GATE_N , RESET_B ) output ( Q ) GN = INV1 ( GATE_N ) DR = AND2 ( D , RESET_B ) Q = LATCH ( DR , GN ) ;
$ dlrbp_ { 1 , 2 } input ( D , GATE , RESET_B ) output ( Q , Q_N ) DR = AND2 ( D , RESET_B ) Q = LATCH ( DR , GATE ) Q_N = INV1 ( Q ) ;
$ dlrbn_ { 1 , 2 } input ( D , GATE_N , RESET_B ) output ( Q , Q_N ) GN = INV1 ( GATE_N ) DR = AND2 ( D , RESET_B ) Q = LATCH ( DR , GN ) Q_N = INV1 ( Q ) ;
$ dlclkp_ { 1 , 2 , 4 } input ( CLK , GATE ) output ( GCLK ) GCLK = AND2 ( CLK , GATE ) ;
$ sdlclkp_ { 1 , 2 , 4 } input ( CLK , GATE , SCE ) output ( GCLK ) G = OR2 ( GATE , SCE ) GCLK = AND2 ( CLK , G ) ;
$ ebufn_ { 1 , 2 , 4 , 8 } input ( A , TE_B ) output ( Z ) TE = INV1 ( TE_B ) Z = AND2 ( A , TE ) ;
$ einvn_ { 0 , 1 , 2 , 4 , 8 } input ( A , TE_B ) output ( Z ) TE = INV1 ( TE_B ) ZI = INV1 ( A ) Z = AND2 ( ZI , TE ) ;
$ einvp_ { 1 , 2 , 4 , 8 } input ( A , TE ) output ( Z ) ZI = INV1 ( A ) Z = AND2 ( ZI , TE ) ;
$ lpflow_inputiso0n_1 input ( A , SLEEP_B ) output ( X ) X = AND2 ( A , SLEEP_B ) ;
$ lpflow_inputiso0p_1 input ( A , SLEEP ) output ( X ) SB = INV1 ( SLEEP ) X = AND2 ( A , SB ) ;
$ lpflow_inputiso1n_1 input ( A , SLEEP_B ) output ( X ) X = AND2 ( A , SLEEP_B ) ;
$ lpflow_inputiso1p_1 input ( A , SLEEP ) output ( X ) SB = INV1 ( SLEEP ) X = AND2 ( A , SB ) ;
$ lpflow_isobufsrc_ { 1 , 2 , 4 , 8 , 16 } input ( A , SLEEP ) output ( X ) AI = INV1 ( A ) X = OR2 ( AI , SLEEP ) ;
$ lpflow_isobufsrckapwr_16 input ( A , SLEEP ) output ( X ) AI = INV1 ( A ) X = OR2 ( AI , SLEEP ) ;
$ lpflow_inputisolatch_1 input ( D , SLEEP_B ) output ( Q ) Q = LATCH ( D , SLEEP_B ) ;
""" .replace( ' $ ' , ' sky130_fd_sc_hd__ ' ))
""" SkyWater 130nm High Density Digital Standard Cells (skywater-pdk-libs-sky130_fd_sc_hd).
"""
techlib_by_name = { k : v for k , v in globals ( ) . items ( ) if isinstance ( v , TechLib ) }