2018-10-01 09:52:17 -05:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
Enhanced techno rule support. Inspector support bug fix.
* Bug: In Hurricane/Commons.h, modify the getRecord<>() templates so
that for both vector<Element> and vector<Element*>, the individual
record created for each element are donne with pointers. That is,
for the vector<Element> case, we take a pointer.
As a general policy, except for the POD types, always use pointers
or references to data in the records/inspector. Never uses values
that can call the copy constructor.
Suppress INSPECTOR_PV_SUPPORT() macro, keep only
INSPECTOR_PR_SUPPORT().
Provide value support only for getString<>() template.
This value & copy constructor problem was causing a crash when
trying to inspect Hurricane::AnalogCellExtension.
* New: In Hurricane::Technology, change the API of the PhysicalRule,
now we can only create/get PhysicalRule, but setting the value of
the rule itself must be done on the rule.
Enhance PhysicalRule to provide for stepped rules, non isotropic
and ratio rules.
Merge TwoLayersPhysicalrule in PhysicalRule, much simpler to
suppress the management of derived classes. That means that we
loose a little memory as some fields are mutually exclusive.
Not a problem considering that there will not be so many of thoses
objects.
* New: In CRL/helpers.analogtechno.py, enhanced DTR support for rules
like:
('minSpacing' , 'metal1', ((0.4,20.0), (0.8,1000.0)), Length, 'REF.1')
('minEnclosure', 'metal1', 'cut1', (0.2,0.3) , Length, 'REF.2')
('minDensity' , 'metal1', 0.30 , Unit , 'REF.3')
The DTR parser has been updated, but not the oroshi.dtr Rule
cache for analog components. Given a rule name, the value used
will be the horizontal one of the first step.
* Change: In hurricane/doc/hurricane, re-generate the documentation
with updated support for Technology & PhysicalRule.
2020-07-21 04:22:04 -05:00
|
|
|
from __future__ import print_function
|
|
|
|
from Hurricane import DbU
|
|
|
|
from helpers import trace
|
2018-10-01 09:52:17 -05:00
|
|
|
|
|
|
|
|
|
|
|
class Rules ( object ):
|
|
|
|
|
2020-07-22 10:26:28 -05:00
|
|
|
ruleSet = [ 'minSpacing_nWell'
|
|
|
|
, 'minWidth_pImplant'
|
|
|
|
, 'minSpacing_pImplant'
|
|
|
|
, 'minSpacing_rpolyh_pImplant'
|
|
|
|
, 'minEnclosure_pImplant_poly2con'
|
|
|
|
, 'minEnclosure_nImplant_active'
|
|
|
|
, 'minEnclosure_pImplant_active'
|
|
|
|
, 'minSpacing_nImplant_pImplant'
|
|
|
|
, 'minSpacing_cut0'
|
|
|
|
, 'minWidth_cut0'
|
|
|
|
, 'minWidth_active'
|
|
|
|
, 'minEnclosure_active_cut0'
|
|
|
|
, 'transistorMinL'
|
|
|
|
, 'transistorMinW'
|
|
|
|
, 'minSpacing_poly'
|
|
|
|
, 'minGateSpacing_poly'
|
|
|
|
, 'minSpacing_poly_active'
|
|
|
|
, 'minExtension_active_poly'
|
|
|
|
, 'minExtension_poly_active'
|
|
|
|
, 'minEnclosure_poly_cut0'
|
|
|
|
, 'minSpacing_cut0_poly'
|
|
|
|
, 'minWidth_cut0'
|
|
|
|
, 'minSpacing_cut0_active'
|
|
|
|
, 'minWidth_metal1'
|
|
|
|
, 'minSpacing_metal1'
|
|
|
|
, 'minEnclosure_metal1_cut0'
|
|
|
|
, 'minEnclosure_metal1_cut1'
|
|
|
|
, 'minWidth_cut1'
|
|
|
|
, 'minSpacing_cut1'
|
|
|
|
, 'minWidth_metal2'
|
|
|
|
, 'minSpacing_metal2'
|
|
|
|
, 'minEnclosure_metal2_cut1'
|
|
|
|
, 'minEnclosure_metal2_cut2'
|
|
|
|
, 'minWidth_cut2'
|
|
|
|
, 'minSpacing_cut2'
|
|
|
|
, 'minWidth_cut1'
|
|
|
|
, 'minSpacing_cut1'
|
|
|
|
, 'minWidth_metal3'
|
|
|
|
, 'minSpacing_metal3'
|
|
|
|
, 'minSpacingWide1_metal3'
|
|
|
|
, 'minEnclosure_metal3_cut2'
|
|
|
|
, 'minSpacingOnMetBot_cut2'
|
|
|
|
, 'minSpacingOnMetCap_cut2'
|
|
|
|
, 'maxWidth_metcap'
|
|
|
|
, 'minSpacing_metbot'
|
|
|
|
, 'minSpacing_cut1_metcap'
|
|
|
|
, 'minSpacing_cut2_metcap'
|
|
|
|
, 'minEnclosure_metbot_metcap'
|
|
|
|
, 'minEnclosure_metbot_cut1'
|
|
|
|
, 'minEnclosure_metbot_cut2'
|
|
|
|
, 'minEnclosure_metcap_cut2'
|
|
|
|
, 'minWidth_metcap'
|
|
|
|
, 'minWidth_metcapdum'
|
|
|
|
, 'minWidth_cpoly'
|
|
|
|
, 'minWidth_poly2'
|
|
|
|
, 'minWidth_rpolyh'
|
|
|
|
, 'minWidthHighPrec_rpolyh'
|
|
|
|
, 'minSpacing_cpoly'
|
|
|
|
, 'minSpacing_poly2'
|
|
|
|
, 'minSpacing_rpolyh'
|
|
|
|
, 'minSpacing_cut0_cpoly'
|
|
|
|
, 'minSpacing_diff_poly2'
|
|
|
|
, 'minSpacing_poly_poly2'
|
|
|
|
, 'minEnclosure_poly_cpoly'
|
|
|
|
, 'minEnclosure_cpoly_cut0'
|
|
|
|
, 'minEnclosure_poly2_cut0'
|
|
|
|
, 'MIMCap'
|
|
|
|
, 'PIPCap'
|
|
|
|
, 'MIMPerimeterCap'
|
|
|
|
, 'PIPPerimeterCap'
|
|
|
|
, 'RPOLYHSheetRes'
|
|
|
|
, 'RPOLY2PHSheetRes'
|
|
|
|
, 'MET1RPOLYHContRes'
|
|
|
|
, 'minWidth_hres'
|
|
|
|
, 'minSpacing_hres'
|
|
|
|
, 'minEnclosure_hres_poly2'
|
|
|
|
, 'minSpacing_hres_poly1'
|
|
|
|
, 'minSpacing_hres_poly2'
|
|
|
|
, 'minSpacing_hres_active'
|
|
|
|
, 'corrFactor90'
|
|
|
|
, 'corrFactor135'
|
|
|
|
, 'minRpolyhSquares'
|
|
|
|
]
|
2018-10-01 09:52:17 -05:00
|
|
|
|
Enhanced techno rule support. Inspector support bug fix.
* Bug: In Hurricane/Commons.h, modify the getRecord<>() templates so
that for both vector<Element> and vector<Element*>, the individual
record created for each element are donne with pointers. That is,
for the vector<Element> case, we take a pointer.
As a general policy, except for the POD types, always use pointers
or references to data in the records/inspector. Never uses values
that can call the copy constructor.
Suppress INSPECTOR_PV_SUPPORT() macro, keep only
INSPECTOR_PR_SUPPORT().
Provide value support only for getString<>() template.
This value & copy constructor problem was causing a crash when
trying to inspect Hurricane::AnalogCellExtension.
* New: In Hurricane::Technology, change the API of the PhysicalRule,
now we can only create/get PhysicalRule, but setting the value of
the rule itself must be done on the rule.
Enhance PhysicalRule to provide for stepped rules, non isotropic
and ratio rules.
Merge TwoLayersPhysicalrule in PhysicalRule, much simpler to
suppress the management of derived classes. That means that we
loose a little memory as some fields are mutually exclusive.
Not a problem considering that there will not be so many of thoses
objects.
* New: In CRL/helpers.analogtechno.py, enhanced DTR support for rules
like:
('minSpacing' , 'metal1', ((0.4,20.0), (0.8,1000.0)), Length, 'REF.1')
('minEnclosure', 'metal1', 'cut1', (0.2,0.3) , Length, 'REF.2')
('minDensity' , 'metal1', 0.30 , Unit , 'REF.3')
The DTR parser has been updated, but not the oroshi.dtr Rule
cache for analog components. Given a rule name, the value used
will be the horizontal one of the first step.
* Change: In hurricane/doc/hurricane, re-generate the documentation
with updated support for Technology & PhysicalRule.
2020-07-21 04:22:04 -05:00
|
|
|
def __init__ ( self, dtr ):
|
|
|
|
trace( 100, '\tRules.__init__()\n' )
|
|
|
|
self.dtr = dtr
|
|
|
|
|
|
|
|
for rule in Rules.ruleSet: self.addAttr(rule)
|
|
|
|
return
|
|
|
|
|
|
|
|
def addAttr ( self, attribute ):
|
|
|
|
if self.__dict__.has_key(attribute): return
|
|
|
|
|
|
|
|
#print( 'Rules.addAttr(): {}'.format(attribute) )
|
|
|
|
value = None
|
|
|
|
words = attribute.split( '_' )
|
|
|
|
try:
|
|
|
|
if len(words) == 1:
|
|
|
|
if words[0].endswith('Cap' ): value = self.dtr.getUnitRule( words[0] ).getDoubleValue()
|
|
|
|
elif words[0].endswith('ContRes' ): value = self.dtr.getUnitRule( words[0] ).getDoubleValue()
|
|
|
|
elif words[0].endswith('Res' ): value = self.dtr.getUnitRule( words[0] ).getDoubleValue()
|
|
|
|
elif words[0].endswith('ctor90' ): value = self.dtr.getUnitRule( words[0] ).getDoubleValue()
|
|
|
|
elif words[0].endswith('ctor135' ): value = self.dtr.getUnitRule( words[0] ).getDoubleValue()
|
|
|
|
elif words[0].endswith('quares' ): value = self.dtr.getUnitRule( words[0] ).getDoubleValue()
|
|
|
|
if (value is None) and len(words) < 4:
|
|
|
|
rule = self.dtr.getPhysicalRule( *tuple(words) )
|
|
|
|
if rule.isDouble():
|
|
|
|
value = rule.getDoubleValue()
|
|
|
|
#print( 'Accessed value (Unit):{}'.format(value) )
|
|
|
|
else:
|
|
|
|
value = rule.getValue()
|
|
|
|
#print( 'Accessed value (DbU):{}'.format(DbU.getValueString(value)) )
|
|
|
|
except Exception, e:
|
|
|
|
print( e )
|
|
|
|
|
|
|
|
if not value is None:
|
|
|
|
self.__dict__[attribute] = value
|
|
|
|
|
|
|
|
return
|