我们之前已经解析了网表,现在需要基于给定的AO311D2网表进行后续步骤:
步骤二:构建图模型
步骤三:欧拉化处理
步骤四:生成欧拉路径
步骤五:布局布线
步骤六:生成版图
注意:给定的网表是SPICE格式,我们之前已经解析了MOS管的信息。现在需要构建连接图。
网表内容:
.SUBCKT AO311D2_7TL40LVT A B C D E VDD VDDB VSS VSSB Z
*.PININFO A:I B:I C:I D:I E:I Z:O VDD:B VDDB:B VSS:B VSSB:B
MM9 sn1 E VSS VSSB nlvtlp m=1 w=220n l=40n
MM11 sn1 C pn1 VSSB nlvtlp m=1 w=220n l=40n
MM13 pn0 A VSS VSSB nlvtlp m=1 w=220n l=40n
MM12 pn1 B pn0 VSSB nlvtlp m=1 w=220n l=40n
MM10 sn1 D VSS VSSB nlvtlp m=1 w=220n l=40n
MM15 Z sn1 VSS VSSB nlvtlp m=1 w=220n l=40n
MM6 pn2 C VDD VDDB plvtlp m=1 w=220n l=40n
MM5 pn2 B VDD VDDB plvtlp m=1 w=220n l=40n
MM8 sn1 E pn3 VDDB plvtlp m=1 w=220n l=40n
MM4 pn2 A VDD VDDB plvtlp m=1 w=220n l=40n
MM7 pn3 D pn2 VDDB plvtlp m=1 w=220n l=40n
MM14 Z sn1 VDD VDDB plvtlp m=2 w=220n l=40n
.ENDS
注意:网表中有些MOS管是NMOS(nlvtlp)和PMOS(plvtlp)。我们分别处理PMOS和NMOS网络。
步骤二:构建图模型
对于每个MOS网络(PMOS和NMOS分开),我们构建一个无向图,其中节点代表扩散区(源/漏),边代表MOS管(栅极作为边的标签)。
以NMOS网络为例(nlvtlp):
MOS管列表(NMOS):
MM9: 漏极=sn1, 栅极=E, 源极=VSS, 衬底=VSSB -> 扩散区连接:sn1和VSS之间有一条边(标签为E)
MM11: 漏极=sn1, 栅极=C, 源极=pn1 -> 扩散区连接:sn1和pn1之间有一条边(标签为C)
MM13: 漏极=pn0, 栅极=A, 源极=VSS -> 扩散区连接:pn0和VSS之间有一条边(标签为A)
MM12: 漏极=pn1, 栅极=B, 源极=pn0 -> 扩散区连接:pn1和pn0之间有一条边(标签为B)
MM10: 漏极=sn1, 栅极=D, 源极=VSS -> 扩散区连接:sn1和VSS之间有一条边(标签为D)
MM15: 漏极=Z, 栅极=sn1, 源极=VSS -> 扩散区连接:Z和VSS之间有一条边(标签为sn1)注意:这里栅极是sn1,但sn1是一个内部节点,所以这条边连接Z和VSS,标签为sn1(栅极)
注意:VSS和VSSB都是地,在连接图中,我们通常将同一电位的节点合并(如VSS和VSSB在连接关系上都是地,所以可以视为同一个节点)。同样,VDD和VDDB也是同一电位。
因此,NMOS网络中的节点有:sn1, pn1, pn0, VSS, Z。
构建图:
节点:VSS, sn1, pn1, pn0, Z
边:
(VSS, sn1): 标签 [E] (来自MM9)
(sn1, pn1): 标签 [C] (来自MM11)
(VSS, pn0): 标签 [A] (来自MM13)
(pn0, pn1): 标签 [B] (来自MM12) 注意:MM12是pn1->pn0,但无向图所以方向无关
(VSS, sn1): 标签 [D] (来自MM10) -> 这里VSS和sn1之间已经有边,现在又有一条边,所以实际上是两条不同的边(同一个节点对可以有多个边,但每条边代表一个MOS管)
(VSS, Z): 标签 [sn1] (来自MM15) 注意:栅极是sn1,所以标签是sn1(表示栅极连接)
但是,注意:同一个节点对之间的多个边(即多个MOS管并联)在图中应该表示为多条边。然而,在欧拉路径中,我们需要处理的是多重图。
同样,PMOS网络(plvtlp):
MOS管:
MM6: 漏极=pn2, 栅极=C, 源极=VDD -> 节点:pn2和VDD,边标签C
MM5: 漏极=pn2, 栅极=B, 源极=VDD -> pn2和VDD,边标签B
MM8: 漏极=sn1, 栅极=E, 源极=pn3 -> sn1和pn3,边标签E
MM4: 漏极=pn2, 栅极=A, 源极=VDD -> pn2和VDD,边标签A
MM7: 漏极=pn3, 栅极=D, 源极=pn2 -> pn3和pn2,边标签D
MM14: 漏极=Z, 栅极=sn1, 源极=VDD -> Z和VDD,边标签sn1(注意:这里m=2表示两个并联的管子,在图中可以表示为一条边,但权重为2,或者拆成两条边?在欧拉路径中,我们通常拆成两条边,因为两个管子是独立的)
注意:MM14的m=2,表示两个并联的PMOS管,因此我们在图中应该添加两条相同的边(连接Z和VDD,栅极都是sn1)。
步骤三:欧拉化处理
欧拉路径要求图是欧拉图(存在欧拉回路)或半欧拉图(存在欧拉路径)。欧拉图的充要条件是所有节点的度数均为偶数;半欧拉图则恰好有两个奇度节点(起点和终点)。
我们需要检查每个网络(NMOS和PMOS)的节点度数(注意:无向图中节点的度数是与节点相连的边的条数,多重图中每条边都独立计数)。
以NMOS网络为例:
节点VSS:连接了哪些边?
与sn1: 2条边(MM9和MM10)
与pn0: 1条边(MM13)
与Z: 1条边(MM15)
所以度数=2+1+1=4(偶数)
节点sn1:连接了VSS(2条边)、pn1(1条边)、还有MM11的边(sn1-pn1)已经算了一条,另外MM10和MM9连接VSS的边不算在sn1的度数里吗?注意:每条边连接两个节点,所以每条边对两个节点的度数各贡献1。
所以sn1:连接VSS(2条边)-> 度数贡献2,连接pn1(1条边)-> 贡献1,另外MM10和MM9都是连接VSS和sn1,所以sn1有2条边连接VSS,1条边连接pn1,没有其他边了?所以度数=2+1=3(奇数)
节点pn1:连接sn1(1条边)和pn0(1条边)-> 度数2(偶数)
节点pn0:连接VSS(1条边)和pn1(1条边)-> 度数2(偶数)
节点Z:连接VSS(1条边)-> 度数1(奇数)
因此,NMOS网络中有两个奇度节点:sn1(度数为3)和Z(度数为1)。所以需要添加一条虚拟边(dummy edge)连接sn1和Z,使得这两个节点的度数变为偶数(sn1变成4,Z变成2),其他节点度数不变。
同样,PMOS网络:
节点VDD:连接pn2(3条边:MM6, MM5, MM4),连接Z(2条边,因为MM14的m=2,所以两条边) -> 度数=3+2=5(奇数)
节点pn2:连接VDD(3条边),连接pn3(1条边,来自MM7) -> 度数=3+1=4(偶数)
节点pn3:连接pn2(1条边)和sn1(1条边,来自MM8) -> 度数2(偶数)
节点sn1:连接pn3(1条边) -> 度数1(奇数)
节点Z:连接VDD(2条边) -> 度数2(偶数)
因此,PMOS网络中有两个奇度节点:VDD(5)和sn1(1)。需要添加一条虚拟边连接VDD和sn1。
步骤四:生成欧拉路径
添加虚拟边后,每个网络都变成欧拉图(所有节点度数为偶数)。然后使用Hierholzer算法寻找欧拉回路(或从任意节点开始)。
注意:欧拉路径的生成需要遍历所有的边,且每条边只能走一次。在路径中,每条边代表一个MOS管,而节点代表扩散区连接点。
步骤五:布局布线
根据欧拉路径的顺序,将MOS管按照路径顺序排列。通常,PMOS在上,NMOS在下,中间是公共栅极(需要对齐的栅极)。在标准单元版图中,一般要求高度固定,宽度可以调整。
对于每个MOS管,我们根据欧拉路径中的顺序确定其位置(从左到右)。同时,需要将栅极对齐:同一个栅极信号的MOS管需要对齐(比如输入A的栅极在PMOS和NMOS中都要对齐)。
步骤六:生成版图
根据布局布线的结果,生成具体的版图几何图形(矩形、多边形等),包括:
有源区(Active Area)
栅极(多晶硅或金属栅)
金属连线(源漏连接、栅极连接)
接触孔(Contact)
电源线(VDD/VSS)在顶部和底部
由于我们这里没有具体的工艺信息,只能给出抽象步骤。
下面我们具体实现步骤二到步骤四(构建图、欧拉化、生成路径),步骤五和六需要版图工具,这里只描述方法。
由于时间关系,我们只详细处理NMOS网络,PMOS网络类似。
步骤二:构建NMOS网络图模型
节点集合:VSS, sn1, pn1, pn0, Z
边集合(用三元组表示:节点1,节点2,标签):
(VSS, sn1, ‘E’) # MM9
(sn1, pn1, ‘C’) # MM11
(VSS, pn0, ‘A’) # MM13
(pn0, pn1, ‘B’) # MM12
(VSS, sn1, ‘D’) # MM10
(VSS, Z, ‘sn1’) # MM15 注意:标签是栅极信号,这里栅极是sn1(内部节点)
注意:MM15的栅极是sn1,但sn1是一个节点,所以标签为’sn1’,表示这个MOS管的栅极连接到节点sn1。在路径中,我们需要记录这个信息以便后续栅极对齐。
步骤三:欧拉化处理
计算节点度数(每条边对两个节点各贡献1):
VSS: 连接了4条边(与sn1的2条,与pn0的1条,与Z的1条) -> 度4
sn1: 连接了3条边(与VSS的2条,与pn1的1条) -> 度3
pn1: 连接了2条边(与sn1的1条,与pn0的1条) -> 度2
pn0: 连接了2条边(与VSS的1条,与pn1的1条) -> 度2
Z: 连接了1条边(与VSS的1条) -> 度1
奇度节点:sn1(3)和Z(1)。添加一条虚拟边:连接sn1和Z,标签为’dummy’。
添加虚拟边后,sn1的度数变为4,Z的度数变为2。
步骤四:生成欧拉路径
现在图是欧拉图(所有节点度数为偶数),我们可以从任意节点开始。
使用Hierholzer算法:
从节点VSS开始,选择一条边:比如(VSS, sn1, ‘E’),到达sn1。
”上述是你之前回答我的,但是没有说完“