发明内容
本发明所要解决的技术问题是提供一种对简化电路网表进行负载反标的方法,它可以实现对电路的准确仿真。
为解决上述技术问题,本发明对简化电路网表进行负载反标的方法的技术解决方案为,包括以下步骤:
第一步,从原始电路网表抽取出仅包含简化电路线路的简化电路网表;
第二步,解读并存储简化电路网表,将简化电路网表按照子网表和顶层网表分开解读,并将关键路径的线路负载保存为三个树状阶层结构的数据;
所述第二步具体包括以下步骤:
步骤(1)、解读并存储简化电路网表中的子网表;
存储简化电路网表中的子网表采用以下三个树状阶层结构:子电路的第一树状阶层结构、子电路的第二树状阶层结构和子电路的第三树状阶层结构;
将用于存储简化电路网表中子电路端口耦合电容的数值的树状阶层结构定义为子电路的第一树状阶层结构,子电路的第一树状阶层结构如下所示:
子单元名----------电容列表序列号
|_______值
|_______搜索标记
其中的搜索标记用于防止反复读取关键路径上的耦合电容值;
将用于存储简化电路网表中子电路子电路多端口同时调用同一个MOS情况的树状阶层结构定义为子电路的第二树状阶层结构,子电路的第二树状阶层结构如下所示:
其中,SA代表MOS管源端的宽度;
SB代表MOS管漏端的宽度;
nrs代表MOS管源端的电阻值;
nrd代表MOS管漏端的电阻值;
ps代表MOS管源端的周长;
pd代表MOS管漏端的周长;
as代表源端的面积;
ad代表漏端的面积;
WL代表沟道宽度和长度;
将用于存储简化电路网表中子电路单一端口调用的各项负载的树状阶层结构定义为子电路的第三树状阶层结构,子电路的第三树状阶层结构如下所示:
对于以字符串.SUBCKT为起始并且第二个字符为非顶层电路名称的行,进入子电路端口识别模式:
所述子电路端口识别模式为:第一个字符串为子电路标示符,第二个字符串为子电路名,存入子电路的第三树状阶层结构中作为关键字,第三个字符串开始为子电路的输入输出端口,将名字和数字序列号存入子电路的第三树状阶层结构中;
对于字母C开头的行,进入电容识别模式:
所述电容识别模式为:第一个字符串为电容标示符,第二、第三个字符串为电容正负极,第四项为电容值;如果正负极都为子电路输入端口,则将端口序列号和值存入子电路的第一树状阶层结构中,如果仅一个端口为子电路输入输出端口,则存入子电路的第三树状阶层结构中;
对于字母X开头的行,进入MOS管识别模式:
所述MOS管识别模式为:首6个字符串为MOS管接入部分,模式匹配为:第一个字符串为MOS管识别符,第二个字符串为漏端接口,第三个字符串为栅端接口,第四个字符串为源端接口,第五个字符串为衬底端接口,第六个字符串为MOS管类型;后面所有字符串为MOS管负载属性,“=”号前字符为属性名,“=”后为属性值;对属性名进行模式识别,获得该属性的属性名后将“=”后方的值存入该属性中;如果漏端、栅端、源端接口中仅有一个为子电路输入输出接口,则存入子电路的第三树状阶层结构中,如果有大于一个电路输入输出接口,则存入子电路的第二树状阶层结构中。
计算子网表上各端口上的负载,并对端口与端口间的耦合电容与共有MOS管进行存储;
计算子网表上各端口上的负载,并对端口与端口间的耦合电容与共有MOS管进行存储的方法是:
对于同一个端口上的多个电容,将多个电容值相加,存储在子电路的第三树状阶层结构中的电容值部分;
对于不同端口的耦合电容,利用两个端口的数字名为关键字,存储在子电路的第一树状阶层结构中,并将子电路的第一树状阶层结构的相关地址返回给该端口的子电路的第三树状阶层结构中的耦合电容表序列号部分;
对于同一个端口的普通MOS管的负载参数,使用如下计算公式来进行MOS管负载运算叠加,并存入子电路的第三树状阶层结构中,公式中的字符Value用来代表SA/SB/as/ad/nrs/nrd/ps/pd中的任一个:
Value=(Value_old×M_old+Value_new×M_new)/(M_old+M_new)
其中:M代表MOS管个数;
_old表示原来的值;_new表示新添加的值;两者使用该公式得出总的Value值;
对于不同端口调用的同一个MOS管,将MOS负载存储在子电路的第二树状阶层结构中,并将子电路的第二树状阶层结构的相关地址返回给该端口的子电路的第三树状阶层结构中的特殊MOS管部分。
步骤(2)、调用并存储简化电路网表中的顶层网表;
a、调用上述三个子电路的树状阶层结构数据,以实现对子电路的调用,形成顶层网表;
b、存储顶层网表;
对于顶层网表,对调用过该子电路的关键路径进行负载计算,得到包含子电路负载的简化电路网表中的关键路径负载数据结构;简化电路网表中的关键路径负载数据结构包括以下三个树状阶层结构:
简化电路网表中的关键路径普通负载存储结构:
简化电路网表中的关键路径耦合电容存储结构:
电容端口名
|_____搜索标记
|_____值
简化电路网表中的关键路径特殊MOS管存储结构:
对于该关键路径对应的普通电容与单端MOS管,调取后存储于关键路径普通负载存储结构中;
对于该关键路径对应的特殊电容,查看是否两端都为关键路径,“是”则调取信息存储于简化电路网表中的关键路径耦合电容存储结构,“不是”则存入简化电路网表中的关键路径普通负载存储结构;
对于该关键路径对应的特殊MOS管,查看Source/Gate/Drain是否有多个连接了关键路径,“是”则存入简化电路网表中的关键路径特殊MOS管存储结构,“不是”则存入简化电路网表中的关键路径普通负载存储结构。
步骤(3),对MOS管的端口互换问题进行预处理,将关键路径上的源端统一换到漏端;对于进行了关键路径端口互换的MOS管,将端口上的负载也进行互换。
第三步,解读原始电路网表,将解析出来的值存储于原始电路网表的三个树状阶层结构中,并对原始电路网表中对应于简化电路网表的简化路线上关键路径的负载进行计算;
所述第三步具体包括以下步骤:
步骤(i)、解读并存储原始电路网表;
原始电路网表采用以下三个树状阶层结构:
原始电路网表中的关键路径普通负载存储结构:
原始电路网表中的关键路径耦合电容存储结构:
关键路径名____电容端口名
|____值
原始电路网表中的关键路径特殊MOS管存储结构:
对于字母C开头的行,进入电容识别模式;
所述电容识别模式为:第一个字符串为电容标示符,第二第三个字符串为电容正负极,第四项为电容值,如果正负极都为子电路输入端口,则将端口序列号和值存入原始电路网表中的关键路径耦合电容存储结构中,如果仅一个端口为子电路输入输出端口,则存入原始电路网表中的关键路径普通负载存储结构中;
对于字母X开头的行,进入MOS管识别模式;
所述MOS管识别模式为:首6个字符串为MOS管接入部分,模式匹配为:第一个字符串为MOS管识别符,第二个字符串为Drain端接口,第三个字符串为Gate端接口,第四个字符串为Source端接口,第五个字符串为Bulk端接口,第六个字符串为MOS管类型;后面所有字符串为MOS管负载属性,“=”号前字符为属性名,“=”后为属性值;对属性名进行模式识别,获得该属性的属性名后将“=”后方的值存入该属性中;如果Drain端、Gate端、Source端接口仅有一个为子电路输入输出接口,则存入原始电路网表中的关键路径普通负载存储结构中;如果有大于一个电路输入输出接口,则存入原始电路网表中的关键路径特殊MOS管存储结构中。
步骤(ii),对MOS管的端口互换问题进行预处理,将关键路径上的源端统一换到漏端;对于进行了关键路径端口互换的MOS管,将端口上的负载也进行互换。
第四步,对原始电路网表与简化电路网表的关键路径上负载的差值进行计算;
对原始电路网表与简化电路网表的端口进行比较,如果端口一致,则判断为同一关键路径,对二者的差值进行计算;
所述对原始电路网表与简化电路网表的端口差值进行计算的方法是:
同一个路径上的普通电容的差值计算公式为:
Cap反标=Cap原始-Cap简化;
同一个路径上具有相同W/L值的MOS管的差值计算公式为:
Value反标=(Value原始×M原始-Value简化×M简化)/(M原始-M简化)
其中,Value表示SA/SB/nrd/nrs/ps/pd/as/ad中的任何一个值;
“原始”表示原始网表中的值;
“简化”表示简化网表中的值;
M表示MOS管个数。
第五步,简化电路网表的关键路径负载反标;
将第四步中计算出的差值添加进简化电路网表中,实现负载反标。
本发明可以达到的技术效果是:
本发明通过解析原始电路网表和简化电路网表,利用原始电路网表对简化电路网表中各简化线路上的相关负载进行反标,从而生成能够大大提高仿真速度的简化电路网表,减少无法仿真的风险。
本发明通过特殊的数据存储结构以及算法,对于指定的电路线路上的相关电容、MOS管等负载进行反标。
本发明能够准确计算出简化电路网表中简化线路上的寄生参数,能够实现对电路的准确仿真。
具体实施方式
如图1、图2所示,本发明对简化电路网表进行负载反标的方法,包括以下步骤:
第一步,利用现有业界通用工具,从原始电路网表抽取出仅包含简化电路线路的简化电路网表;
第二步,解读并存储简化电路网表,将简化电路网表按照子网表和顶层网表分开解读,并将关键路径的线路负载保存为三个树状阶层结构的数据;
将简化电路网表中的各子电路(简化线路)定义为关键路径,关键路径即为影响电路仿真结果的电路线路;
解读简化电路网表,对于电路网表中的数据,每条有效记录以空格为标志位进行分割并以模式识别的方法进行抽取;
步骤(1)、解读并存储简化电路网表中的子网表(子电路模块);
存储简化电路网表中的子网表采用以下三个树状阶层结构:子电路的第一树状阶层结构、子电路的第二树状阶层结构和子电路的第三树状阶层结构;
将用于存储简化电路网表中子电路端口耦合电容的数值的树状阶层结构定义为子电路的第一树状阶层结构,子电路的第一树状阶层结构如下所示:
子单元名----------电容列表序列号
|______值
|______搜索标记
其中的搜索标记用于防止反复读取关键路径上的耦合电容值;
例如:SUBCKT{“Circuit1”}->{1}->{Value}=1e-10
SUBCKT{“Circuit1”}->{1}->{Searched}=0
将用于存储简化电路网表中子电路子电路多端口同时调用同一个MOS情况的树状阶层结构定义为子电路的第二树状阶层结构,子电路的第二树状阶层结构如下所示:
其中,SA代表MOS管源端的宽度;
SB代表MOS管漏端的宽度;
nrs代表MOS管源端的电阻值;
nrd代表MOS管漏端的电阻值;
ps代表MOS管源端的周长;
pd代表MOS管漏端的周长;
as代表源端的面积;
ad代表漏端的面积;
WL代表沟道宽度和长度值;
例如:
SUBCKT{“Circuit1”}->{1}->{Port}=“0 2 3”这里0 2 3为子电路端口号
SUBCKT{“Circuit1”}->{1}->{SA}=3e-10
SUBCKT{“Circuit1”}->{1}->{WL}=0.42e-6_0.15e-6
SUBCKT{“Circuit1”}->{1}->{Searched}=0
将用于存储简化电路网表中子电路单一端口调用的各项负载的树状阶层结构定义为子电路的第三树状阶层结构,子电路的第三树状阶层结构如下所示:
例如:
SUBCKT{“Circuit1”}->{PORTLIST}->{“IN”}=0用来储存端口名对应的序列号
SUBCKT{“Circuit1”}->{PNUM}->{0}->{Name}=“IN”;
SUBCKT{“Circuit1”}->{PNUM}->{0}->{Cap}=1e-15用来储存一端接地CAP电容
SUBCKT{“Circuit1”}->{PNUM}->{0}->{SCap}->{1}=2用来储存耦合电容地址信息
SUBCKT{“Circuit1”}->{PNUM}->{0}->{MOS}->{NDRN}->{“VDD”}->{0.42e-6_0.15e-6}->{SA}=4e-6
SUBCKT{“Circuit1”}->{PNUM}->{0}->{SMOS}->{0}=1用来储存特殊MOS地址位
对于以字符串.SUBCKT为起始并且第二个字符为非顶层电路名称的行,进入子电路端口识别模式:
第一个字符串为子电路标示符,第二个字符串为子电路名,存入子电路的第三树状阶层结构中作为关键字,第三个字符串开始为子电路的输入输出端口,将名字和数字序列号存入子电路的第三树状阶层结构中,如下所示:
.SUBCKT 字符串2 字符串3 字符串4……
子电路标示符 子电路名 输入输出端口 输入输出端口
对于字母C开头的行,进入电容识别模式:
第一个字符串为电容标示符,第二、第三个字符串为电容正负极,第四项为电容值;如果正负极都为子电路输入端口,则将端口序列号和值存入子电路的第一树状阶层结构中,如果仅一个端口为子电路输入输出端口,则存入子电路的第三树状阶层结构中;
C开头字符串 字符串2 字符串3 字符串4
电容标示符 正极 负极 值
对于字母X开头的行,进入MOS管识别模式:
首6个字符串为MOS管接入部分,模式匹配为:第一个字符串为MOS管识别符,第二个字符串为Drain(漏)端接口,第三个字符串为Gate(栅)端接口,第四个字符串为Source(源)端接口,第五个字符串为Bulk(衬底)端接口,第六个字符串为MOS管类型;后面所有字符串为MOS管负载属性,“=”号前字符为属性名,“=”后为属性值;对属性名进行模式识别,获得该属性的属性名后将“=”后方的值存入该属性中;如果Drain端、Gate端、Source端接口中仅有一个为子电路输入输出接口,则存入子电路的第三树状阶层结构中,如果有大于一个电路输入输出接口,则存入子电路的第二树状阶层结构中;
X开头字符串 字符串2 字符串3 字符串4 字符串5 字符串6 字符串7…
MOS管标示符 Drain端 Gate端 Source端 衬底 管类型 参数值
对于电路网表中的子电路,由于关键路径可能会调用到,所以计算出子网表上各端口上的电容、MOS管等负载,并考虑到可能会出现关键路径调用的不同端口可能连接同一个负载,所以对端口与端口间的耦合电容与共有MOS管进行特殊存储,以备顶层网表调用;
对于同一个端口上的多个电容,将多个电容值相加,即使用公式:Cap总=Cap1+Cap2,存储在子电路的第三树状阶层结构中的电容值部分;
对于不同端口的耦合电容,利用两个端口的数字名为关键字(须考虑端口SWAP),存储在子电路的第一树状阶层结构中,并将子电路的第一树状阶层结构的相关地址返回给该端口的子电路的第三树状阶层结构中的耦合电容表序列号部分;
对于同一个端口的普通MOS管的负载参数,使用如下计算公式来进行MOS管负载运算叠加,并存入子电路的第三树状阶层结构中,公式中的字符Value用来代表SA/SB/as/ad/nrs/nrd/ps/pd中的任一个:
Value=(Value_old×M_old+Value_new×M_new)/(M_old+M_new)
其中:M代表MOS管个数;
_old表示原来的值;_new表示新添加的值;两者使用该公式得出总的Value值;
对于不同端口调用的同一个MOS管,将MOS负载存储在子电路的第二树状阶层结构中,并将子电路的第二树状阶层结构的相关地址返回给该端口的子电路的第三树状阶层结构中的特殊MOS管部分;
步骤(2)、调用并存储简化电路网表中的顶层网表;
a、调用上述三个子电路的树状阶层结构数据,以实现对子电路的调用,形成顶层网表;
调用方法是:
对于主电路行,以“/”先行分割成字符串1和字符串2,然后再以空格对字符串1和字符串2进行二次分割;
字符串1中第一个字符串为标示符,第二个开始为该电路调用的实际输入端;
字符串2中第一个字符串为被调用的子电路名A;如下所示:
X开头标示符 左字符串1 左字符串2… / 右字符串1 右字符串2 右字符串3…
调用标示符 调用端口1 调用端口2 子电路名 调用值1 调用值2
如果实际输入端中存在关键路径,则以子电路名A为关键字并按照关键路径的序列号调取子电路的第三树状阶层结构中相应的负载值;
b、存储顶层网表;
对于顶层网表,对调用过该子电路的关键路径进行负载计算,得到包含子电路负载的简化电路网表中的关键路径负载数据结构;简化电路网表中的关键路径负载数据结构包括以下三个树状阶层结构:
简化电路网表中的关键路径普通负载存储结构:
例如:
SNET{“Net1”}->{MOS}->{NDRN}->{0.42e-6_0.15e-6}->{SA}=4e-6
简化电路网表中的关键路径耦合电容存储结构:
电容端口名
|_____搜索标记
|_____值
例如:SNETCAP{“Net1 Net2”}->{Value}=1e-15
简化电路网表中的关键路径特殊MOS管存储结构:
例如:
SNETMOS{“Net1 Net2 Net3”}->{NDRN}->{VPWRA}->{0.42e-6_0.15e-6}->{SA}=4e-6
对于该关键路径对应的普通电容与单端MOS管,调取后存储于关键路径普通负载存储结构中;
对于该关键路径对应的特殊电容,查看是否两端都为关键路径,“是”则调取信息存储于简化电路网表中的关键路径耦合电容存储结构,“不是”则存入简化电路网表中的关键路径普通负载存储结构;
对于该关键路径对应的特殊MOS管,查看Source/Gate/Drain是否有多个连接了关键路径,“是”则存入简化电路网表中的关键路径特殊MOS管存储结构,“不是”则存入简化电路网表中的关键路径普通负载存储结构;
步骤(3)、对MOS管的SWAP(端口互换)问题进行预处理,即进行网表端口同一化的调整;
如果原始电路网表与简化电路网表的电容端口一致但正负极相反,如简化电路网表的电容端口为net1 net2,而原始电路网表为net2 net1,则在差值计算之前需要进行一次网表端口同一化的调整;
另外,简化电路网表与原始电路网表的MOS管存在SWAP(端口互换)的情况,如简化电路网表MOS端口为net1 net2 net3,而原始电路网表为net3 net2 net1,因此也需要在差值计算之前进行一次网表端口同一化的调整;
网表端口同一化的调整方法是:
由于MOS管的Source(源)和Drain(漏)端口可以互换,为了计算方便以及后期的反标,将关键路径上的Source端统一换到Drain端,以方便处理;
将关键路径上的Source端换到Drain端的方法是:
对于源端接关键路径而漏端未接关键路径的MOS管,统一将源、漏两端连接进行互换,即将子电路的第二树状阶层结构中的端口分布部分中的Source(源)端换到Drain(漏)端;对于进行了关键路径端口互换的MOS管,将端口上的负载也进行互换,即将Source端与Drain端上的面积值、周长值以及电阻值等进行互换,以保证关键路径都接在漏端,从而方便计算;
相应算法如下:
SNET{“Net1”}->{MOS}->{NDRN}->{0.42e-6_0.15e-6}->{SA}=SB
SNET{“Net1”}->{MOS}->{NDRN}->{0.42e-6_0.15e-6}->{SB}=SA
SNETMOS{“Net1 Net2 Other”}->{NDRN}->{VPWRA}->{0.42e-6_0.15e-6}->{SA}=
SNETMOS{“Other Net2 Net1”}->{NDRN}->{VPWRA}->{0.42e-6_0.15e-6}->{SB}
Delete SNETMOS{“Other Net2 Net1”}->{NDRN}->{VPWRA}->{0.42e-6_0.15e-6}
第三步,解读原始电路网表,将解析出来的值存储于原始电路网表的三个树状阶层结构中,并对原始电路网表中对应于简化电路网表的简化路线上关键路径的负载进行计算;
步骤(1)、解读并存储原始电路网表;
原始电路网表采用以下三个树状阶层结构:
原始电路网表中的关键路径普通负载存储结构:
例如:
CNET{Net1}->{MOS}->{NDRN}->{VPWRA}->{0.42e-6_0.15e-6}->{SA}=6e-6
原始电路网表中的关键路径耦合电容存储结构:
关键路径名____电容端口名
|____值
例如:
CNETCAP{Net1 Net2}=10e-15
原始电路网表中的关键路径特殊MOS管存储结构:
例如:
CNETMOS{Net1 Net2 Net3}->{NDRN}->{0.42e-6_0.15e-6}->{SA}=6e-6
对于字母C开头的行,进入电容识别模式:
第一个字符串为电容标示符,第二第三个字符串为电容正负极,第四项为电容值,如果正负极都为子电路输入端口,则将端口序列号和值存入原始电路网表中的关键路径耦合电容存储结构中,如果仅一个端口为子电路输入输出端口,则存入原始电路网表中的关键路径普通负载存储结构中;
对于字母X开头的行,进入MOS管识别模式:
首6个字符串为MOS管接入部分,模式匹配为:第一个字符串为MOS管识别符,第二个字符串为Drain端接口,第三个字符串为Gate端接口,第四个字符串为Source端接口,第五个字符串为Bulk端接口,第六个字符串为MOS管类型;后面所有字符串为MOS管负载属性,“=”号前字符为属性名,“=”后为属性值;对属性名进行模式识别,获得该属性的属性名后将“=”后方的值存入该属性中;如果Drain端、Gate端、Source端接口仅有一个为子电路输入输出接口,则存入原始电路网表中的关键路径普通负载存储结构中;如果有大于一个电路输入输出接口,则存入原始电路网表中的关键路径特殊MOS管存储结构中;
步骤(2)、对MOS管的SWAP(端口互换)问题进行预处理;
为了计算方便以及后期的反标,将关键路径上的Source端统一换到Drain端,以方便处理;
相应算法如下:
CNET{“Net1”}->{MOS}->{NDRN}->{0.42e-6_0.15e-6}->{SA}=SB
CNET{“Net1”}->{MOS}->{NDRN}->{0.42e-6_0.15e-6}->{SB}=SA
CNETMOS{“Net1 Net2 Other”}->{NDRN}->{VPWRA}->{0.42e-6_0.15e-6}->{SA}=
CNETMOS{“Other Net2 Net1”}->{NDRN}->{VPWRA}->{0.42e-6_0.15e-6}->{SB}
Delete CNETMOS{“Other Net2 Net1”}->{NDRN}->{VPWRA}->{0.42e-6_0.15e-6}
第四步,对原始电路网表与简化电路网表的关键路径上负载的差值进行计算;
对原始电路网表与简化电路网表的端口进行比较,如果端口一致,则判断为同一关键路径,对二者(即原始电路网表的端口与简化电路网表的端口)的差值进行计算;
同一个路径上的普通电容的差值计算公式为:
Cap反标=Cap原始-Cap简化;
同一个路径上具有相同W/L值(沟道宽度值/沟道长度值)的MOS管的差值计算公式为:
Value反标=(Value原始×M原始-Value简化×M简化)/(M原始-M简化);
其中,Value表示SA/SB/nrd/nrs/ps/pd/as/ad中的任何一个值;
“原始”表示原始网表中的值;
“简化”表示简化网表中的值;
M表示MOS管个数。
第五步,简化电路网表的关键路径负载反标;
将第四步中计算出的差值添加进简化电路网表中,实现负载反标。
本发明可采用Perl程序语言来实现电路网表的反标。