Integration of the latest Coloquinte in Etesian & misc modifs.
* New: In Bootstrap, in Builder & coriolisEnv.py support for RHEL7/SL7. The sub-directory name is 'el7_64'. In qt_setup() add QtSvg to list of Qt5 & Qt4 used libraries. * New: In Hurricane, In Cell add a placeholder for flags. First use to store whether the Nets have been transhierarchically flatteneds. * New: In Hurricane, In NetRoutingState add an Unconnected flag for more accurate diagnosis. * New: Hurricane, in CellViewer add an entry menu for stress tests. The script must be named "stressScript.py" in the cwd. * Change: In CRL Core, in display.conf add a scaling parameter for the display threhold of the layer. This way we can adapt to different standard cells height. * Change: In CRL Core, in ISPD05 bookshelf loader, use the pitch of the cell gauge instead of a hard-wired 5.0. * Change: In Cumulus, in ClockTreePlugin, add support for Etesian placer and a new configuration parameter to choose between Mauka/Etesian. * New: In Etesian, support for the latest Coloquinte. Add feed insertion stage. * Bug: In Kite, In BuildPowerRails, check that _ck is not NULL before tring to access it's name... * Change: In Kite, check if the Cell has it's Nets flattened before doing it (or not).
This commit is contained in:
parent
56bd484429
commit
b18219d807
|
@ -36,11 +36,11 @@ projects = [ { 'name' : "coloquinte"
|
|||
, 'tools' : [ "hurricaneAMS"
|
||||
, "amsCore"
|
||||
, "opSim"
|
||||
, "scribe"
|
||||
#, "scribe"
|
||||
, "graph"
|
||||
, "pharos"
|
||||
, "isis"
|
||||
, "schematic"
|
||||
#, "schematic"
|
||||
, "solver"
|
||||
, "autoDTR"
|
||||
]
|
||||
|
|
|
@ -141,7 +141,7 @@ class Configuration ( object ):
|
|||
lines = uname.stdout.readlines()
|
||||
|
||||
if self._osSlsoc7x_64.match(lines[0]):
|
||||
self._osType = "Linux.el7"
|
||||
self._osType = "Linux.el7_64"
|
||||
self._libSuffix = "64"
|
||||
elif self._osSlsoc6x_64.match(lines[0]):
|
||||
self._osType = "Linux.slsoc6x_64"
|
||||
|
|
|
@ -212,25 +212,33 @@
|
|||
#
|
||||
macro(setup_qt)
|
||||
if(WITH_QT5)
|
||||
message(STATUS "Attempt to find Qt 5...")
|
||||
# For Qt5
|
||||
find_package(Qt5Core REQUIRED)
|
||||
find_package(Qt5Gui REQUIRED)
|
||||
find_package(Qt5Widgets REQUIRED)
|
||||
find_package(Qt5Svg REQUIRED)
|
||||
find_package(Qt5PrintSupport REQUIRED)
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(QtX_INCLUDE_DIR ${Qt5PrintSupport_INCLUDE_DIR}
|
||||
${Qt5Widgets_INCLUDE_DIR}
|
||||
${Qt5Gui_INCLUDE_DIR}
|
||||
${Qt5Core_INCLUDE_DIR} )
|
||||
set(QtX_INCLUDE_DIR ${Qt5PrintSupport_INCLUDE_DIRS}
|
||||
${Qt5Widgets_INCLUDE_DIRS}
|
||||
${Qt5Svg_INCLUDE_DIRS}
|
||||
${Qt5Gui_INCLUDE_DIRS}
|
||||
${Qt5Core_INCLUDE_DIRS} )
|
||||
set(QtX_LIBRARIES ${Qt5PrintSupport_LIBRARIES}
|
||||
${Qt5Widgets_LIBRARIES}
|
||||
${Qt5Gui_LIBRARIES}
|
||||
${Qt5Core_LIBRARIES} )
|
||||
#message(STATUS "QtX_INCLUDE_DIR: ${QtX_INCLUDE_DIR}")
|
||||
#message(STATUS "QtX_LIBRARIES: ${QtX_LIBRARIES}")
|
||||
else()
|
||||
message(STATUS "Attempt to find Qt 4...")
|
||||
# For Qt4.
|
||||
#set(QT_USE_QTXML "true")
|
||||
set(QT_USE_QTSVG "true")
|
||||
find_package(Qt4 REQUIRED)
|
||||
include(${QT_USE_FILE})
|
||||
# ${QT_QTSVG_LIBRARY}
|
||||
set(QtX_LIBRARIES ${QT_LIBRARIES})
|
||||
endif()
|
||||
endmacro()
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
FIND_PATH(QWT_INCLUDE_DIR NAMES qwt.h PATHS
|
||||
/usr/include
|
||||
/usr/include/qt5
|
||||
/usr/local/include
|
||||
"$ENV{LIB_DIR}/include"
|
||||
"$ENV{INCLUDE}"
|
||||
|
|
|
@ -191,6 +191,7 @@ if __name__ == "__main__":
|
|||
version = "%d.%d" % (pyVersion[0],pyVersion[1])
|
||||
if osType.startswith("Linux.SL") \
|
||||
or osType.startswith("Linux.sl") \
|
||||
or osType.startswith("Linux.el") \
|
||||
or osType.startswith("Darwin") \
|
||||
or osType.startswith("Cygwin"):
|
||||
sitePackagesDir = "%s/python%s/site-packages" % (absLibDir,version)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
|
||||
install ( FILES techno.conf DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY common DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY ispd05 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY cmos DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY vsc200 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
install ( DIRECTORY scmos_deep_018 DESTINATION ${SYS_CONF_DIR}/coriolis2 )
|
||||
|
|
|
@ -6,4 +6,5 @@ import helpers
|
|||
# - <defaultStyle>
|
||||
# - <stylesTable>
|
||||
|
||||
scale = 1.0
|
||||
execfile( helpers.sysConfDir+'/common/display.conf' )
|
||||
|
|
|
@ -20,4 +20,5 @@ parametersTable = \
|
|||
, ('chip.pad.pvsseck' , TypeString, 'pvsseck_px')
|
||||
, ('clockTree.minimumSide' , TypeInt , 300)
|
||||
, ('clockTree.buffer' , TypeString, 'buf_x2')
|
||||
, ('clockTree.placerEngine' , TypeString, 'Mauka')
|
||||
)
|
||||
|
|
|
@ -19,63 +19,63 @@ stylesTable = \
|
|||
, (Drawing, 'fallback' , { 'color':'Gray238' , 'border':1, 'pattern':'55AA55AA55AA55AA' })
|
||||
, (Drawing, 'background' , { 'color':'Gray50' , 'border':1 })
|
||||
, (Drawing, 'foreground' , { 'color':'White' , 'border':1 })
|
||||
, (Drawing, 'rubber' , { 'color':'192,0,192' , 'border':2, 'threshold':0.02 })
|
||||
, (Drawing, 'rubber' , { 'color':'192,0,192' , 'border':2, 'threshold':0.02*scale })
|
||||
, (Drawing, 'phantom' , { 'color':'Seashell4' , 'border':1 })
|
||||
, (Drawing, 'boundaries' , { 'color':'208,199,192', 'border':1, 'pattern':'0000000000000000', 'threshold':0 })
|
||||
, (Drawing, 'marker' , { 'color':'80,250,80' , 'border':1 })
|
||||
, (Drawing, 'selectionDraw' , { 'color':'White' , 'border':1 })
|
||||
, (Drawing, 'selectionFill' , { 'color':'White' , 'border':1 })
|
||||
, (Drawing, 'grid' , { 'color':'White' , 'border':1, 'threshold':2.0 })
|
||||
, (Drawing, 'spot' , { 'color':'White' , 'border':2, 'threshold':6.0 })
|
||||
, (Drawing, 'grid' , { 'color':'White' , 'border':1, 'threshold':2.0*scale })
|
||||
, (Drawing, 'spot' , { 'color':'White' , 'border':2, 'threshold':6.0*scale })
|
||||
, (Drawing, 'ghost' , { 'color':'White' , 'border':1 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'White' , 'border':1, 'threshold':0.0 })
|
||||
, (Drawing, 'text.instance' , { 'color':'Black' , 'border':1, 'threshold':4.0 })
|
||||
, (Drawing, 'text.reference' , { 'color':'White' , 'border':1, 'threshold':20.0 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'White' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'text.instance' , { 'color':'Black' , 'border':1, 'threshold':4.0*scale })
|
||||
, (Drawing, 'text.reference' , { 'color':'White' , 'border':1, 'threshold':20.0*scale })
|
||||
, (Drawing, 'undef' , { 'color':'Violet' , 'border':0, 'pattern':'2244118822441188' })
|
||||
, (Drawing, 'mauka.container', { 'color':'Magenta4' , 'border':4, 'pattern':'0000000000000000', 'goMatched':False })
|
||||
|
||||
# Group: Active Layer.
|
||||
, (Group , 'Active Layer')
|
||||
, (Drawing, 'nWell' , { 'color':'Tan' , 'pattern':'55AA55AA55AA55AA', 'threshold':1.5 })
|
||||
, (Drawing, 'pWell' , { 'color':'LightYellow', 'pattern':'55AA55AA55AA55AA', 'threshold':1.50 })
|
||||
, (Drawing, 'nImplant', { 'color':'LawnGreen' , 'pattern':'55AA55AA55AA55AA', 'threshold':1.50 })
|
||||
, (Drawing, 'pImplant', { 'color':'Yellow' , 'pattern':'55AA55AA55AA55AA', 'threshold':1.50 })
|
||||
, (Drawing, 'active' , { 'color':'White' , 'pattern':'antihash1.8' , 'threshold':1.50 })
|
||||
, (Drawing, 'poly' , { 'color':'Red' , 'pattern':'55AA55AA55AA55AA', 'threshold':1.50 })
|
||||
, (Drawing, 'nWell' , { 'color':'Tan' , 'pattern':'55AA55AA55AA55AA', 'threshold':1.5 *scale })
|
||||
, (Drawing, 'pWell' , { 'color':'LightYellow', 'pattern':'55AA55AA55AA55AA', 'threshold':1.50*scale })
|
||||
, (Drawing, 'nImplant', { 'color':'LawnGreen' , 'pattern':'55AA55AA55AA55AA', 'threshold':1.50*scale })
|
||||
, (Drawing, 'pImplant', { 'color':'Yellow' , 'pattern':'55AA55AA55AA55AA', 'threshold':1.50*scale })
|
||||
, (Drawing, 'active' , { 'color':'White' , 'pattern':'antihash1.8' , 'threshold':1.50*scale })
|
||||
, (Drawing, 'poly' , { 'color':'Red' , 'pattern':'55AA55AA55AA55AA', 'threshold':1.50*scale })
|
||||
|
||||
# Group: Routing Layer.
|
||||
, (Group , 'Routing Layer')
|
||||
, (Drawing, 'metal1' , { 'color':'Blue' , 'pattern':'poids2.8' , 'threshold':0.80 })
|
||||
, (Drawing, 'metal2' , { 'color':'Aqua' , 'pattern':'light_antihash0.8' , 'threshold':0.02 })
|
||||
, (Drawing, 'metal3' , { 'color':'LightPink', 'pattern':'light_antihash1.8' , 'threshold':0.02 })
|
||||
, (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'light_antihash2.8' , 'threshold':0.02 })
|
||||
, (Drawing, 'metal5' , { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.02 })
|
||||
, (Drawing, 'metal6' , { 'color':'Violet' , 'pattern':'light_antihash0.8' , 'threshold':0.02 })
|
||||
, (Drawing, 'metal1' , { 'color':'Blue' , 'pattern':'poids2.8' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'metal2' , { 'color':'Aqua' , 'pattern':'light_antihash0.8' , 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal3' , { 'color':'LightPink', 'pattern':'light_antihash1.8' , 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'light_antihash2.8' , 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal5' , { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal6' , { 'color':'Violet' , 'pattern':'light_antihash0.8' , 'threshold':0.02*scale })
|
||||
|
||||
# Group: Cuts (VIA holes).
|
||||
, (Group , 'Cuts (VIA Holes)')
|
||||
, (Drawing, 'cut0', { 'color':'0,150,150', 'threshold':1.50 })
|
||||
, (Drawing, 'cut1', { 'color':'Aqua' , 'threshold':0.80 })
|
||||
, (Drawing, 'cut2', { 'color':'LightPink', 'threshold':0.80 })
|
||||
, (Drawing, 'cut3', { 'color':'Green' , 'threshold':0.80 })
|
||||
, (Drawing, 'cut4', { 'color':'Yellow' , 'threshold':0.80 })
|
||||
, (Drawing, 'cut5', { 'color':'Violet' , 'threshold':0.80 })
|
||||
, (Drawing, 'cut0', { 'color':'0,150,150', 'threshold':1.50*scale })
|
||||
, (Drawing, 'cut1', { 'color':'Aqua' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut2', { 'color':'LightPink', 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut3', { 'color':'Green' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut4', { 'color':'Yellow' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut5', { 'color':'Violet' , 'threshold':0.80*scale })
|
||||
|
||||
# Group: MIM6.
|
||||
, (Group , 'MIM6')
|
||||
, (Drawing, 'topmim6', { 'color':'Blue' , 'pattern':'poids2.8' , 'threshold':0.80 })
|
||||
, (Drawing, 'botmim6', { 'color':'Aqua' , 'pattern':'light_antihash0.8', 'threshold':0.80 })
|
||||
, (Drawing, 'padopen', { 'color':'LightPink', 'pattern':'light_antihash1.8', 'threshold':0.80 })
|
||||
, (Drawing, 'alucap' , { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80 })
|
||||
, (Drawing, 'topmim6', { 'color':'Blue' , 'pattern':'poids2.8' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'botmim6', { 'color':'Aqua' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale })
|
||||
, (Drawing, 'padopen', { 'color':'LightPink', 'pattern':'light_antihash1.8', 'threshold':0.80*scale })
|
||||
, (Drawing, 'alucap' , { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80*scale })
|
||||
|
||||
# Group: Blockages.
|
||||
, (Group , 'Blockages')
|
||||
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'006070381c0e0703' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage2', { 'color':'Aqua' , 'pattern':'8103060c183060c0' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage3', { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage4', { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage5', { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage6', { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'006070381c0e0703' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage2', { 'color':'Aqua' , 'pattern':'8103060c183060c0' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage3', { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage4', { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage5', { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage6', { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
|
||||
# Group: Knik & Kite.
|
||||
, (Group , 'Knik & Kite')
|
||||
|
@ -98,11 +98,11 @@ stylesTable = \
|
|||
, (Drawing, 'foreground' , { 'color':'Black', 'border':1 })
|
||||
, (Drawing, 'selectionDraw', { 'color':'Black', 'border':1 })
|
||||
, (Drawing, 'selectionFill', { 'color':'Black', 'border':1 })
|
||||
, (Drawing, 'grid' , { 'color':'Black', 'border':1, 'threshold':6.0 })
|
||||
, (Drawing, 'spot' , { 'color':'Black', 'border':1, 'threshold':6.0 })
|
||||
, (Drawing, 'grid' , { 'color':'Black', 'border':1, 'threshold':6.0*scale })
|
||||
, (Drawing, 'spot' , { 'color':'Black', 'border':1, 'threshold':6.0*scale })
|
||||
, (Drawing, 'ghost' , { 'color':'Black', 'border':1 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'Black', 'border':1, 'threshold':0.0 })
|
||||
, (Drawing, 'text.instance', { 'color':'Black', 'border':1, 'threshold':4.0 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'Black', 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'text.instance', { 'color':'Black', 'border':1, 'threshold':4.0*scale })
|
||||
, (Drawing, 'undef' , { 'color':'Black', 'border':0, 'pattern':'2244118822441188' })
|
||||
)
|
||||
|
||||
|
@ -116,70 +116,70 @@ stylesTable = \
|
|||
, (Drawing, 'fallback' , { 'color':'Gray238' , 'border':1, 'pattern':'55AA55AA55AA55AA' })
|
||||
, (Drawing, 'background' , { 'color':'Gray50' , 'border':1 })
|
||||
, (Drawing, 'foreground' , { 'color':'White' , 'border':1 })
|
||||
, (Drawing, 'rubber' , { 'color':'192,0,192' , 'border':4, 'threshold':0.02 })
|
||||
, (Drawing, 'rubber' , { 'color':'192,0,192' , 'border':4, 'threshold':0.02*scale })
|
||||
, (Drawing, 'phantom' , { 'color':'Seashell4' , 'border':1 })
|
||||
, (Drawing, 'boundaries' , { 'color':'208,199,192', 'border':1, 'pattern':'0000000000000000', 'threshold':0 })
|
||||
, (Drawing, 'marker' , { 'color':'80,250,80' , 'border':1 })
|
||||
, (Drawing, 'selectionDraw' , { 'color':'White' , 'border':1 })
|
||||
, (Drawing, 'selectionFill' , { 'color':'White' , 'border':1 })
|
||||
, (Drawing, 'grid' , { 'color':'White' , 'border':1, 'threshold':2.0 })
|
||||
, (Drawing, 'spot' , { 'color':'White' , 'border':2, 'threshold':6.0 })
|
||||
, (Drawing, 'grid' , { 'color':'White' , 'border':1, 'threshold':2.0*scale })
|
||||
, (Drawing, 'spot' , { 'color':'White' , 'border':2, 'threshold':6.0*scale })
|
||||
, (Drawing, 'ghost' , { 'color':'White' , 'border':1 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'White' , 'border':1, 'threshold':0.0 })
|
||||
, (Drawing, 'text.instance' , { 'color':'White' , 'border':1, 'threshold':4.0 })
|
||||
, (Drawing, 'text.reference', { 'color':'White' , 'border':1, 'threshold':20.0 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'White' , 'border':1, 'threshold':0.0 *scale })
|
||||
, (Drawing, 'text.instance' , { 'color':'White' , 'border':1, 'threshold':4.0 *scale })
|
||||
, (Drawing, 'text.reference', { 'color':'White' , 'border':1, 'threshold':20.0*scale })
|
||||
, (Drawing, 'undef' , { 'color':'Violet' , 'border':0, 'pattern':'2244118822441188' })
|
||||
|
||||
# Active Layers.
|
||||
, (Group , 'Active Layers')
|
||||
, (Drawing, 'nWell' , { 'color':'Tan' , 'pattern':'urgo.8' , 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'pWell' , { 'color':'LightYellow', 'pattern':'urgo.8' , 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'nImplant', { 'color':'LawnGreen' , 'pattern':'antihash0.8' , 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'pImplant', { 'color':'Yellow' , 'pattern':'antihash0.8' , 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'active' , { 'color':'White' , 'pattern':'antihash1.8' , 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'poly' , { 'color':'Red' , 'pattern':'poids2.8' , 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'poly2' , { 'color':poly2Color , 'pattern':'poids2.8' , 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'nWell' , { 'color':'Tan' , 'pattern':'urgo.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'pWell' , { 'color':'LightYellow', 'pattern':'urgo.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'nImplant', { 'color':'LawnGreen' , 'pattern':'antihash0.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'pImplant', { 'color':'Yellow' , 'pattern':'antihash0.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'active' , { 'color':'White' , 'pattern':'antihash1.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'poly' , { 'color':'Red' , 'pattern':'poids2.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'poly2' , { 'color':poly2Color , 'pattern':'poids2.8' , 'border':1, 'threshold':1.50*scale })
|
||||
|
||||
# Routing Layers.
|
||||
, (Group , 'Routing Layers')
|
||||
#, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'light_antislash0.8', 'border':1, 'threshold':0.80 })
|
||||
, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'slash.8' , 'border':1, 'threshold':0.80 })
|
||||
, (Drawing, 'metal2', { 'color':'Aqua' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal3', { 'color':'LightPink', 'pattern':'poids4.8' , 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal4', { 'color':'Green' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal5', { 'color':'Yellow' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal6', { 'color':'Violet' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal7', { 'color':'Red' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal8', { 'color':'Blue' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02 })
|
||||
#, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'light_antislash0.8', 'border':1, 'threshold':0.80*scale })
|
||||
, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'slash.8' , 'border':1, 'threshold':0.80*scale })
|
||||
, (Drawing, 'metal2', { 'color':'Aqua' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal3', { 'color':'LightPink', 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal4', { 'color':'Green' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal5', { 'color':'Yellow' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal6', { 'color':'Violet' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal7', { 'color':'Red' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal8', { 'color':'Blue' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
|
||||
# Cuts (VIA holes).
|
||||
, (Group , 'Cuts (VIA holes)')
|
||||
, (Drawing, 'cut0', { 'color':'0,150,150', 'threshold':1.50 })
|
||||
, (Drawing, 'cut1', { 'color':'Aqua' , 'threshold':0.80 })
|
||||
, (Drawing, 'cut2', { 'color':'LightPink', 'threshold':0.80 })
|
||||
, (Drawing, 'cut3', { 'color':'Green' , 'threshold':0.80 })
|
||||
, (Drawing, 'cut4', { 'color':'Yellow' , 'threshold':0.80 })
|
||||
, (Drawing, 'cut5', { 'color':'Violet' , 'threshold':0.80 })
|
||||
, (Drawing, 'cut6', { 'color':'Red' , 'threshold':0.80 })
|
||||
, (Drawing, 'cut7', { 'color':'Blue' , 'threshold':0.80 })
|
||||
, (Drawing, 'cut0', { 'color':'0,150,150', 'threshold':1.50*scale })
|
||||
, (Drawing, 'cut1', { 'color':'Aqua' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut2', { 'color':'LightPink', 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut3', { 'color':'Green' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut4', { 'color':'Yellow' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut5', { 'color':'Violet' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut6', { 'color':'Red' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut7', { 'color':'Blue' , 'threshold':0.80*scale })
|
||||
|
||||
# MIM6.
|
||||
, (Group , 'MIM6')
|
||||
, (Drawing, 'topmim6', { 'color':'Blue' , 'pattern':'poids2.32' , 'threshold':0.80 })
|
||||
, (Drawing, 'botmim6', { 'color':'Aqua' , 'pattern':'light_antihash0.8' , 'threshold':0.80 })
|
||||
, (Drawing, 'padopen', { 'color':'LightPink', 'pattern':'light_antihash1.8' , 'threshold':0.80 })
|
||||
, (Drawing, 'alucap' , { 'color':'Green' , 'pattern':'light_antihash2.8' , 'threshold':0.80 })
|
||||
, (Drawing, 'topmim6', { 'color':'Blue' , 'pattern':'poids2.32' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'botmim6', { 'color':'Aqua' , 'pattern':'light_antihash0.8' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'padopen', { 'color':'LightPink', 'pattern':'light_antihash1.8' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'alucap' , { 'color':'Green' , 'pattern':'light_antihash2.8' , 'threshold':0.80*scale })
|
||||
|
||||
# Blockages.
|
||||
, (Group , 'Blockages')
|
||||
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'light_antislash0.8', 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage2', { 'color':'Aqua' , 'pattern':'poids4.8' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage3', { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage4', { 'color':'Green' , 'pattern':'poids4.8' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage5', { 'color':'Yellow' , 'pattern':'poids4.8' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage6', { 'color':'Violet' , 'pattern':'poids4.8' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage7', { 'color':'Red' , 'pattern':'poids4.8' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage8', { 'color':'Blue' , 'pattern':'poids4.8' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'light_antislash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage2', { 'color':'Aqua' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage3', { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage4', { 'color':'Green' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage5', { 'color':'Yellow' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage6', { 'color':'Violet' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage7', { 'color':'Red' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage8', { 'color':'Blue' , 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
|
||||
# Knick & Kite.
|
||||
, (Group , 'Knick & Kite')
|
||||
|
@ -203,12 +203,12 @@ stylesTable = \
|
|||
, (Drawing, 'foreground' , { 'color':'Black', 'border':1 })
|
||||
, (Drawing, 'selectionDraw' , { 'color':'Black', 'border':1 })
|
||||
, (Drawing, 'selectionFill' , { 'color':'Black', 'border':1 })
|
||||
, (Drawing, 'grid' , { 'color':'Black', 'border':1, 'threshold':6.0 })
|
||||
, (Drawing, 'spot' , { 'color':'Black', 'border':1, 'threshold':6.0 })
|
||||
, (Drawing, 'grid' , { 'color':'Black', 'border':1, 'threshold':6.0*scale })
|
||||
, (Drawing, 'spot' , { 'color':'Black', 'border':1, 'threshold':6.0*scale })
|
||||
, (Drawing, 'ghost' , { 'color':'Black', 'border':1 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'Black', 'border':1, 'threshold':0.0 })
|
||||
, (Drawing, 'text.instance' , { 'color':'Black', 'border':1, 'threshold':4.0 })
|
||||
, (Drawing, 'text.reference', { 'color':'Black', 'border':1, 'threshold':20.0 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'Black', 'border':1, 'threshold':0.0 *scale })
|
||||
, (Drawing, 'text.instance' , { 'color':'Black', 'border':1, 'threshold':4.0 *scale })
|
||||
, (Drawing, 'text.reference', { 'color':'Black', 'border':1, 'threshold':20.0*scale })
|
||||
, (Drawing, 'undef' , { 'color':'Black', 'border':0, 'pattern':'2244118822441188' })
|
||||
)
|
||||
|
||||
|
@ -238,30 +238,30 @@ stylesTable = \
|
|||
|
||||
# Active Layers.
|
||||
, (Group , 'Active Layers')
|
||||
, (Drawing, 'nWell' , { 'color':'Tan' , 'pattern':'0000000000000000', 'threshold':1.50, 'border':2 })
|
||||
, (Drawing, 'pWell' , { 'color':'LightYellow', 'pattern':'0000000000000000', 'threshold':1.50, 'border':2 })
|
||||
, (Drawing, 'nImplant', { 'color':'LawnGreen' , 'pattern':'0000000000000000', 'threshold':1.50, 'border':2 })
|
||||
, (Drawing, 'pImplant', { 'color':'Yellow' , 'pattern':'0000000000000000', 'threshold':1.50, 'border':2 })
|
||||
, (Drawing, 'active' , { 'color':'White' , 'pattern':'0000000000000000', 'threshold':1.50, 'border':2 })
|
||||
, (Drawing, 'poly' , { 'color':'Red' , 'pattern':'0000000000000000', 'threshold':1.50, 'border':2 })
|
||||
, (Drawing, 'nWell' , { 'color':'Tan' , 'pattern':'0000000000000000', 'threshold':1.50*scale, 'border':2 })
|
||||
, (Drawing, 'pWell' , { 'color':'LightYellow', 'pattern':'0000000000000000', 'threshold':1.50*scale, 'border':2 })
|
||||
, (Drawing, 'nImplant', { 'color':'LawnGreen' , 'pattern':'0000000000000000', 'threshold':1.50*scale, 'border':2 })
|
||||
, (Drawing, 'pImplant', { 'color':'Yellow' , 'pattern':'0000000000000000', 'threshold':1.50*scale, 'border':2 })
|
||||
, (Drawing, 'active' , { 'color':'White' , 'pattern':'0000000000000000', 'threshold':1.50*scale, 'border':2 })
|
||||
, (Drawing, 'poly' , { 'color':'Red' , 'pattern':'0000000000000000', 'threshold':1.50*scale, 'border':2 })
|
||||
|
||||
# Routing Layers.
|
||||
, (Group , 'Routing Layers')
|
||||
, (Drawing, 'metal1' , { 'color':'Blue' , 'pattern':'0000000000000000', 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'metal2' , { 'color':'Aqua' , 'pattern':'0000000000000000', 'threshold':0.40, 'border':2 })
|
||||
, (Drawing, 'metal3' , { 'color':'LightPink', 'pattern':'0000000000000000', 'threshold':0.02, 'border':2 })
|
||||
, (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'0000000000000000', 'threshold':0.02, 'border':2 })
|
||||
, (Drawing, 'metal5' , { 'color':'Yellow' , 'pattern':'0000000000000000', 'threshold':0.02, 'border':2 })
|
||||
, (Drawing, 'metal6' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.02, 'border':2 })
|
||||
, (Drawing, 'metal1' , { 'color':'Blue' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'metal2' , { 'color':'Aqua' , 'pattern':'0000000000000000', 'threshold':0.40*scale, 'border':2 })
|
||||
, (Drawing, 'metal3' , { 'color':'LightPink', 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
, (Drawing, 'metal4' , { 'color':'Green' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
, (Drawing, 'metal5' , { 'color':'Yellow' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
, (Drawing, 'metal6' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':2 })
|
||||
|
||||
# Cuts (VIA holes).
|
||||
, (Group , 'Cuts (VIA holes)')
|
||||
, (Drawing, 'cut0' , { 'color':'0,150,150', 'pattern':'poids4.8' , 'threshold':1.50, 'border':1 })
|
||||
, (Drawing, 'cut1' , { 'color':'Aqua' , 'pattern':'0000000000000000', 'threshold':0.80, 'border':1 })
|
||||
, (Drawing, 'cut2' , { 'color':'LightPink', 'pattern':'0000000000000000', 'threshold':0.80, 'border':1 })
|
||||
, (Drawing, 'cut3' , { 'color':'Green' , 'pattern':'0000000000000000', 'threshold':0.80, 'border':1 })
|
||||
, (Drawing, 'cut4' , { 'color':'Yellow' , 'pattern':'0000000000000000', 'threshold':0.80, 'border':1 })
|
||||
, (Drawing, 'cut5' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.80, 'border':1 })
|
||||
, (Drawing, 'cut0' , { 'color':'0,150,150', 'pattern':'poids4.8' , 'threshold':1.50*scale, 'border':1 })
|
||||
, (Drawing, 'cut1' , { 'color':'Aqua' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
, (Drawing, 'cut2' , { 'color':'LightPink', 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
, (Drawing, 'cut3' , { 'color':'Green' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
, (Drawing, 'cut4' , { 'color':'Yellow' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
, (Drawing, 'cut5' , { 'color':'Violet' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':1 })
|
||||
)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
|
@ -273,14 +273,14 @@ stylesTable = \
|
|||
# Group: Viewer.
|
||||
, (Group , 'Viewer')
|
||||
, (Drawing, 'background' , { 'color':'White', 'border':1 })
|
||||
, (Drawing, 'grid' , { 'color':'Black', 'border':1, 'threshold':2.0 })
|
||||
, (Drawing, 'spot' , { 'color':'Black', 'border':1, 'threshold':2.0 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'Black', 'border':1, 'threshold':0.0 })
|
||||
, (Drawing, 'text.reference', { 'color':'Black', 'border':1, 'threshold':20.0 })
|
||||
, (Drawing, 'grid' , { 'color':'Black', 'border':1, 'threshold':2.0 *scale })
|
||||
, (Drawing, 'spot' , { 'color':'Black', 'border':1, 'threshold':2.0 *scale })
|
||||
, (Drawing, 'text.ruler' , { 'color':'Black', 'border':1, 'threshold':0.0 *scale })
|
||||
, (Drawing, 'text.reference', { 'color':'Black', 'border':1, 'threshold':20.0*scale })
|
||||
|
||||
# Group: Active Layers.
|
||||
, (Group , 'Active Layers')
|
||||
, (Drawing, 'active', { 'color':'175,175,175', 'pattern':'0000000000000000', 'threshold':1.50, 'border':2 })
|
||||
, (Drawing, 'active', { 'color':'175,175,175', 'pattern':'0000000000000000', 'threshold':1.50*scale, 'border':2 })
|
||||
)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
|
@ -293,64 +293,64 @@ stylesTable = \
|
|||
, (Drawing, 'fallback' , { 'color':'Gray238' , 'border':1, 'pattern':'55AA55AA55AA55AA' })
|
||||
, (Drawing, 'background' , { 'color':'White' , 'border':1 })
|
||||
, (Drawing, 'foreground' , { 'color':'Black' , 'border':1 })
|
||||
, (Drawing, 'rubber' , { 'color':'192,0,192', 'border':4, 'threshold':0.02 })
|
||||
, (Drawing, 'rubber' , { 'color':'192,0,192', 'border':4, 'threshold':0.02*scale })
|
||||
, (Drawing, 'phantom' , { 'color':'Seashell4', 'border':1 })
|
||||
, (Drawing, 'boundaries' , { 'color':'Black' , 'border':1, 'pattern':'0000000000000000', 'threshold':0 })
|
||||
, (Drawing, 'marker' , { 'color':'80,250,80', 'border':1 })
|
||||
, (Drawing, 'selectionDraw' , { 'color':'Black' , 'border':1 })
|
||||
, (Drawing, 'selectionFill' , { 'color':'Black' , 'border':1 })
|
||||
, (Drawing, 'grid' , { 'color':'Black' , 'border':1, 'threshold':2.0 })
|
||||
, (Drawing, 'spot' , { 'color':'Black' , 'border':2, 'threshold':6.0 })
|
||||
, (Drawing, 'grid' , { 'color':'Black' , 'border':1, 'threshold':2.0*scale })
|
||||
, (Drawing, 'spot' , { 'color':'Black' , 'border':2, 'threshold':6.0*scale })
|
||||
, (Drawing, 'ghost' , { 'color':'Black' , 'border':1 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'Black' , 'border':1, 'threshold':0.0 })
|
||||
, (Drawing, 'text.instance' , { 'color':'Black' , 'border':1, 'threshold':4.0 })
|
||||
, (Drawing, 'text.reference' , { 'color':'Black' , 'border':1, 'threshold':20.0 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'Black' , 'border':1, 'threshold':0.0 *scale })
|
||||
, (Drawing, 'text.instance' , { 'color':'Black' , 'border':1, 'threshold':4.0 *scale })
|
||||
, (Drawing, 'text.reference' , { 'color':'Black' , 'border':1, 'threshold':20.0*scale })
|
||||
, (Drawing, 'undef' , { 'color':'Violet' , 'border':0, 'pattern':'2244118822441188' })
|
||||
, (Drawing, 'mauka.container', { 'color':'Magenta4' , 'border':4, 'pattern':'0000000000000000', 'goMatched':False })
|
||||
|
||||
# Group: Active Layers.
|
||||
, (Group , 'Active Layers')
|
||||
, (Drawing, 'nWell' , { 'color':'Tan' , 'pattern':'antipoids2.32', 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'pWell' , { 'color':'LightYellow', 'pattern':'antipoids2.32', 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'nImplant', { 'color':'LawnGreen' , 'pattern':'diffusion.32' , 'border':0, 'threshold':1.50 })
|
||||
, (Drawing, 'pImplant', { 'color':'Yellow' , 'pattern':'diffusion.32' , 'border':0, 'threshold':1.50 })
|
||||
, (Drawing, 'active' , { 'color':'White' , 'pattern':'active.32' , 'border':0, 'threshold':1.50 })
|
||||
, (Drawing, 'poly' , { 'color':'Red' , 'pattern':'antipoids2.32', 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'poly2' , { 'color':poly2Color , 'pattern':'antipoids2.32', 'border':1, 'threshold':1.50 })
|
||||
, (Drawing, 'nWell' , { 'color':'Tan' , 'pattern':'antipoids2.32', 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'pWell' , { 'color':'LightYellow', 'pattern':'antipoids2.32', 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'nImplant', { 'color':'LawnGreen' , 'pattern':'diffusion.32' , 'border':0, 'threshold':1.50*scale })
|
||||
, (Drawing, 'pImplant', { 'color':'Yellow' , 'pattern':'diffusion.32' , 'border':0, 'threshold':1.50*scale })
|
||||
, (Drawing, 'active' , { 'color':'White' , 'pattern':'active.32' , 'border':0, 'threshold':1.50*scale })
|
||||
, (Drawing, 'poly' , { 'color':'Red' , 'pattern':'antipoids2.32', 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'poly2' , { 'color':poly2Color , 'pattern':'antipoids2.32', 'border':1, 'threshold':1.50*scale })
|
||||
|
||||
# Group: Routing Layers.
|
||||
, (Group , 'Routing Layers')
|
||||
, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'slash.32' , 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal2', { 'color':'Aqua' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal3', { 'color':'LightPink', 'pattern':'antislash3.32', 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal4', { 'color':'Green' , 'pattern':'antislash4.32', 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal5', { 'color':'Yellow' , 'pattern':'antislash5.32', 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal6', { 'color':'Violet' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02 })
|
||||
, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'slash.32' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal2', { 'color':'Aqua' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal3', { 'color':'LightPink', 'pattern':'antislash3.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal4', { 'color':'Green' , 'pattern':'antislash4.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal5', { 'color':'Yellow' , 'pattern':'antislash5.32', 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal6', { 'color':'Violet' , 'pattern':'antislash2.32', 'border':1, 'threshold':0.02*scale })
|
||||
|
||||
# Group: Cuts (VIA holes)
|
||||
, (Group , 'Cuts (VIA holes)')
|
||||
, (Drawing, 'cut0', { 'color':'Blue' , 'pattern':'poids2.8' , 'border':2, 'threshold':1.50 })
|
||||
, (Drawing, 'cut1', { 'color':'Aqua' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.80 })
|
||||
, (Drawing, 'cut2', { 'color':'LightPink', 'pattern':'poids2.8' , 'border':2, 'threshold':0.80 })
|
||||
, (Drawing, 'cut3', { 'color':'Green' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.80 })
|
||||
, (Drawing, 'cut4', { 'color':'Yellow' , 'pattern':'poids2.8' , 'border':2, 'threshold':0.80 })
|
||||
, (Drawing, 'cut5', { 'color':'Violet' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.80 })
|
||||
, (Drawing, 'cut0', { 'color':'Blue' , 'pattern':'poids2.8' , 'border':2, 'threshold':1.50*scale })
|
||||
, (Drawing, 'cut1', { 'color':'Aqua' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut2', { 'color':'LightPink', 'pattern':'poids2.8' , 'border':2, 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut3', { 'color':'Green' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut4', { 'color':'Yellow' , 'pattern':'poids2.8' , 'border':2, 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut5', { 'color':'Violet' , 'pattern':'antipoids2.8', 'border':2, 'threshold':0.80*scale })
|
||||
|
||||
# Group: MIM6.
|
||||
, (Group , 'MIM6')
|
||||
, (Drawing, 'topmim6', { 'color':'Blue' , 'pattern':'poids2.8' , 'threshold':0.80 })
|
||||
, (Drawing, 'botmim6', { 'color':'Aqua' , 'pattern':'light_antihash0.8', 'threshold':0.80 })
|
||||
, (Drawing, 'padopen', { 'color':'LightPink', 'pattern':'light_antihash1.8', 'threshold':0.80 })
|
||||
, (Drawing, 'alucap' , { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80 })
|
||||
, (Drawing, 'topmim6', { 'color':'Blue' , 'pattern':'poids2.8' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'botmim6', { 'color':'Aqua' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale })
|
||||
, (Drawing, 'padopen', { 'color':'LightPink', 'pattern':'light_antihash1.8', 'threshold':0.80*scale })
|
||||
, (Drawing, 'alucap' , { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80*scale })
|
||||
|
||||
# Group: Blockages.
|
||||
, (Group , 'Blockages')
|
||||
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'006070381c0e0703' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage2', { 'color':'Aqua' , 'pattern':'8103060c183060c0' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage3', { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage4', { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage5', { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage6', { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80, 'border':2 })
|
||||
, (Drawing, 'blockage1', { 'color':'Blue' , 'pattern':'006070381c0e0703' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage2', { 'color':'Aqua' , 'pattern':'8103060c183060c0' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage3', { 'color':'LightPink', 'pattern':'poids4.8' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage4', { 'color':'Green' , 'pattern':'light_antihash2.8', 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage5', { 'color':'Yellow' , 'pattern':'1144114411441144' , 'threshold':0.80*scale, 'border':2 })
|
||||
, (Drawing, 'blockage6', { 'color':'Violet' , 'pattern':'light_antihash0.8', 'threshold':0.80*scale, 'border':2 })
|
||||
|
||||
# Group: Knik & Kite.
|
||||
, (Group , 'Knik & Kite')
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "alliance.conf<cmos>" -*-
|
||||
|
||||
from helpers.Alliance import AddMode
|
||||
from helpers.Alliance import Gauge
|
||||
|
||||
|
||||
allianceTop = '/soc/alliance'
|
||||
cellsTop = allianceTop+'/cells/'
|
||||
|
||||
|
||||
allianceConfig = \
|
||||
( ( 'SYMB_TECHNO_NAME' , helpers.symbolicTechno )
|
||||
, ( 'REAL_TECHNO_NAME' , helpers.realTechno )
|
||||
, ( 'SYMBOLIC_TECHNOLOGY', helpers.symbolicDir+'/technology.conf' )
|
||||
, ( 'REAL_TECHNOLOGY' , helpers.realDir +'/technology.conf' )
|
||||
, ( 'DISPLAY' , helpers.sysConfDir +'/display.xml' )
|
||||
, ( 'CATALOG' , 'CATAL')
|
||||
, ( 'WORKING_LIBRARY' , '.')
|
||||
, ( 'SYSTEM_LIBRARY' , ( (cellsTop+'sxlib' , AddMode.Append)
|
||||
, (cellsTop+'dp_sxlib', AddMode.Append)
|
||||
, (cellsTop+'ramlib' , AddMode.Append)
|
||||
, (cellsTop+'romlib' , AddMode.Append)
|
||||
, (cellsTop+'rflib' , AddMode.Append)
|
||||
, (cellsTop+'rf2lib' , AddMode.Append)
|
||||
, (cellsTop+'pxlib' , AddMode.Append)
|
||||
, (cellsTop+'padlib' , AddMode.Append) ) )
|
||||
, ( 'SCALE_X' , 100)
|
||||
, ( 'IN_LO' , 'vst')
|
||||
, ( 'IN_PH' , 'ap')
|
||||
, ( 'OUT_LO' , 'vst')
|
||||
, ( 'OUT_PH' , 'ap')
|
||||
, ( 'POWER' , 'vdd')
|
||||
, ( 'GROUND' , 'vss')
|
||||
, ( 'CLOCK' , '^ck.*')
|
||||
, ( 'BLOCKAGE' , '^blockage[Nn]et*')
|
||||
, ( 'PAD' , '.*_px$')
|
||||
# The following are only read by the Alliance tool wrappers.
|
||||
, ( 'ALLIANCE_TOP' , allianceTop)
|
||||
, ( 'MBK_TARGET_LIB' , cellsTop+'sxlib')
|
||||
, ( 'RDS_TECHNO_NAME' , allianceTop+'/etc/cmos.rds')
|
||||
, ( 'GRAAL_TECHNO_NAME' , allianceTop+'/etc/graal.rds')
|
||||
)
|
||||
|
||||
|
||||
# Format of routingGaugesTable (dictionary):
|
||||
# A list of entry of the form:
|
||||
# ( METAL_NAME, (Direction, Type, depth, density, offset, pitch, wire_width, via_width) )
|
||||
|
||||
routingGaugesTable = {}
|
||||
|
||||
routingGaugesTable['sxlib'] = \
|
||||
( ( 'METAL1', ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 5, 2, 1 ) )
|
||||
, ( 'METAL2', ( Gauge.Horizontal, Gauge.Default, 1, 7.0, 0, 5, 2, 1 ) )
|
||||
, ( 'METAL3', ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 5, 2, 1 ) )
|
||||
, ( 'METAL4', ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 5, 2, 1 ) )
|
||||
, ( 'METAL5', ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 5, 2, 1 ) )
|
||||
#, ( 'METAL6', ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 5, 2, 1 ) )
|
||||
#, ( 'METAL7', ( Gauge.Vertical , Gauge.Default, 6, 0.0, 0, 5, 2, 1 ) )
|
||||
)
|
||||
|
||||
|
||||
# Format of cellGaugesTable (dictionary):
|
||||
# A list of entry of the form:
|
||||
# ( METAL_PIN, xy_common_pitch, slice_height, slice_step )
|
||||
|
||||
cellGaugesTable = {}
|
||||
cellGaugesTable['ispd05'] = ('metal2', 5.0, 60.0, 5.0)
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "display.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Provides standard settings for:
|
||||
# - <defaultStyle>
|
||||
# - <stylesTable>
|
||||
|
||||
scale = 1.0
|
||||
execfile( helpers.sysConfDir+'/common/display.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "hMetis.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/hMetis.conf' )
|
|
@ -0,0 +1,23 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "kite.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Contains the layout (shared by all technologies).
|
||||
execfile( helpers.sysConfDir+'/common/kite.conf' )
|
||||
|
||||
|
||||
parametersTable = \
|
||||
( ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters.
|
||||
, ("katabatic.saturateRatio" ,TypePercentage,80 )
|
||||
, ("katabatic.saturateRp" ,TypeInt ,8 )
|
||||
, ('katabatic.topRoutingLayer' ,TypeString , 'METAL5')
|
||||
# Kite parameters.
|
||||
, ("kite.hTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } )
|
||||
, ("kite.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } )
|
||||
, ("kite.eventsLimit" ,TypeInt ,4000002 )
|
||||
, ("kite.ripupCost" ,TypeInt ,3 , { 'min':0 } )
|
||||
, ("kite.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } )
|
||||
, ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } )
|
||||
, ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
, ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } )
|
||||
)
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "mauka.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/mauka.conf' )
|
|
@ -0,0 +1,9 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "misc.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Provides standard settings for:
|
||||
# # - <defaultStyle>
|
||||
# # - <stylesTable>
|
||||
#
|
||||
execfile( helpers.sysConfDir+'/common/misc.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "nimbus.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/nimbus.conf' )
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "patterns.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/patterns.conf' )
|
|
@ -0,0 +1,23 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "plugins.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# Contains the layout (shared by all technologies).
|
||||
#execfile( helpers.sysConfDir+'/common/plugins.conf' )
|
||||
|
||||
|
||||
# Parameters for chip plugin.
|
||||
parametersTable = \
|
||||
( ("chip.block.rails.count" , TypeInt , 5 )
|
||||
, ("chip.block.rails.hWidth" , TypeInt , 12 )
|
||||
, ("chip.block.rails.vWidth" , TypeInt , 12 )
|
||||
, ("chip.block.rails.hSpacing" , TypeInt , 6 )
|
||||
, ("chip.block.rails.vSpacing" , TypeInt , 6 )
|
||||
, ('chip.pad.pck' , TypeString, 'pck_px')
|
||||
, ('chip.pad.pvddick' , TypeString, 'pvddick_px')
|
||||
, ('chip.pad.pvssick' , TypeString, 'pvssick_px')
|
||||
, ('chip.pad.pvddeck' , TypeString, 'pvddeck_px')
|
||||
, ('chip.pad.pvsseck' , TypeString, 'pvsseck_px')
|
||||
, ('clockTree.minimumSide' , TypeInt , 300)
|
||||
, ('clockTree.buffer' , TypeString, 'buf_x2')
|
||||
)
|
|
@ -0,0 +1,15 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "stratus1.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
|
||||
# Status1 parameters.
|
||||
parametersTable = \
|
||||
( ("stratus1.mappingName", TypeString, helpers.sysConfDir+"/stratus2sxlib.xml",
|
||||
{ 'flags':Cfg.Parameter.Flags.NeedRestart|Cfg.Parameter.Flags.MustExist } )
|
||||
, ("stratus1.format" , TypeString, "vst")
|
||||
, ("stratus1.simulator" , TypeString, "asimut")
|
||||
,)
|
||||
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/stratus1.conf' )
|
|
@ -0,0 +1,162 @@
|
|||
# -*- Mode:Python; explicit-buffer-name: "technology.conf<cmos>" -*-
|
||||
|
||||
import helpers
|
||||
|
||||
# The informations here are extracted from the Alliance ".rds" file,
|
||||
# and must be coherent with it.
|
||||
#
|
||||
# Provides standard settings for:
|
||||
# - <viewerConfig>
|
||||
# - <realLayersTable>
|
||||
# - <symbolicLayersTable>
|
||||
# - <workingLayersTable>
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/technology.conf' )
|
||||
|
||||
|
||||
# Format of <symbolicRulesTable>:
|
||||
# Each entry is a pair of (string, value).
|
||||
# * string: a synthetic way to designate the symbolic layer on which
|
||||
# it applies, an optional real layer in case where there is
|
||||
# more than one, and the dimension name.
|
||||
# * value : the rule (dimension) value expressed in lambda.
|
||||
symbolicRulesTable = \
|
||||
( ('NWELL.nWell.extention.cap' , 0.0)
|
||||
, ('PWELL.pWell.extention.cap' , 0.0)
|
||||
|
||||
, ('NTIE.minimum.width' , 3.0)
|
||||
, ('NTIE.nWell.extention.cap' , 1.5)
|
||||
, ('NTIE.nWell.extention.width' , 0.5)
|
||||
, ('NTIE.nImplant.extention.cap' , 1.0)
|
||||
, ('NTIE.nImplant.extention.width' , 0.5)
|
||||
, ('NTIE.active.extention.cap' , 0.5)
|
||||
, ('NTIE.active.extention.width' , 0.0)
|
||||
|
||||
, ('PTIE.minimum.width' , 3.0)
|
||||
, ('PTIE.pWell.extention.cap' , 1.5)
|
||||
, ('PTIE.pWell.extention.width' , 0.5)
|
||||
, ('PTIE.pImplant.extention.cap' , 1.0)
|
||||
, ('PTIE.pImplant.extention.width' , 0.5)
|
||||
, ('PTIE.active.extention.cap' , 0.5)
|
||||
, ('PTIE.active.extention.width' , 0.0)
|
||||
|
||||
, ('NDIF.minimum.width' , 3.0)
|
||||
, ('NDIF.nImplant.extention.cap' , 1.0)
|
||||
, ('NDIF.nImplant.extention.width' , 0.5)
|
||||
, ('NDIF.active.extention.cap' , 0.5)
|
||||
, ('NDIF.active.extention.width' , 0.0)
|
||||
|
||||
, ('PDIF.minimum.width' , 3.0)
|
||||
, ('PDIF.pImplant.extention.cap' , 1.0)
|
||||
, ('PDIF.pImplant.extention.width' , 0.5)
|
||||
, ('PDIF.active.extention.cap' , 0.5)
|
||||
, ('PDIF.active.extention.width' , 0.0)
|
||||
|
||||
, ('GATE.minimum.width' , 1.0)
|
||||
, ('GATE.poly.extention.cap' , 1.5)
|
||||
|
||||
, ('NTRANS.minimum.width' , 1.0)
|
||||
, ('NTRANS.nImplant.extention.cap' , -1.0)
|
||||
, ('NTRANS.nImplant.extention.width' , 2.5)
|
||||
, ('NTRANS.active.extention.cap' , -1.5)
|
||||
, ('NTRANS.active.extention.width' , 2.0)
|
||||
|
||||
, ('PTRANS.minimum.width' , 1.0)
|
||||
, ('PTRANS.nWell.extention.cap' , -1.0)
|
||||
, ('PTRANS.nWell.extention.width' , 4.5)
|
||||
, ('PTRANS.pImplant.extention.cap' , -1.0)
|
||||
, ('PTRANS.pImplant.extention.width' , 4.0)
|
||||
, ('PTRANS.active.extention.cap' , -1.5)
|
||||
, ('PTRANS.active.extention.width' , 3.0)
|
||||
|
||||
, ('POLY.minimum.width' , 1.0)
|
||||
, ('POLY.poly.extention.cap' , 0.5)
|
||||
, ('POLY2.minimum.width' , 1.0)
|
||||
, ('POLY2.poly.extention.cap' , 0.5)
|
||||
|
||||
# Routing Layers.
|
||||
, ('METAL1.minimum.width' , 1.0)
|
||||
, ('METAL1.metal1.extention.cap' , 0.5)
|
||||
, ('METAL2.minimum.width' , 1.0)
|
||||
, ('METAL2.metal2.extention.cap' , 1.0)
|
||||
, ('METAL3.minimum.width' , 1.0)
|
||||
, ('METAL3.metal3.extention.cap' , 1.0)
|
||||
, ('METAL4.minimum.width' , 1.0)
|
||||
, ('METAL4.metal4.extention.cap' , 1.0)
|
||||
, ('METAL5.minimum.width' , 2.0)
|
||||
, ('METAL5.metal5.extention.cap' , 1.0)
|
||||
, ('METAL6.minimum.width' , 2.0)
|
||||
, ('METAL6.metal6.extention.cap' , 1.0)
|
||||
, ('METAL7.minimum.width' , 2.0)
|
||||
, ('METAL7.metal6.extention.cap' , 1.0)
|
||||
, ('METAL8.minimum.width' , 2.0)
|
||||
, ('METAL8.metal6.extention.cap' , 1.0)
|
||||
|
||||
# Contacts (i.e. Active <--> Metal).
|
||||
, ('CONT_BODY_N.minimum.side' , 1.0)
|
||||
, ('CONT_BODY_N.nWell.enclosure' , 1.5)
|
||||
, ('CONT_BODY_N.nImplant.enclosure' , 1.5)
|
||||
, ('CONT_BODY_N.active.enclosure' , 1.0)
|
||||
, ('CONT_BODY_N.metal1.enclosure' , 0.5)
|
||||
|
||||
, ('CONT_BODY_P.minimum.side' , 1.0)
|
||||
, ('CONT_BODY_P.pWell.enclosure' , 1.5)
|
||||
, ('CONT_BODY_P.pImplant.enclosure' , 1.5)
|
||||
, ('CONT_BODY_P.active.enclosure' , 1.0)
|
||||
, ('CONT_BODY_P.metal1.enclosure' , 0.5)
|
||||
|
||||
, ('CONT_DIF_N.minimum.side' , 1.0)
|
||||
, ('CONT_DIF_N.nImplant.enclosure' , 1.0)
|
||||
, ('CONT_DIF_N.active.enclosure' , 0.5)
|
||||
, ('CONT_DIF_N.metal1.enclosure' , 0.5)
|
||||
|
||||
, ('CONT_DIF_P.minimum.side' , 1.0)
|
||||
, ('CONT_DIF_P.pImplant.enclosure' , 1.0)
|
||||
, ('CONT_DIF_P.active.enclosure' , 0.5)
|
||||
, ('CONT_DIF_P.metal1.enclosure' , 0.5)
|
||||
|
||||
, ('CONT_POLY.minimum.width' , 1.0)
|
||||
, ('CONT_POLY.poly.enclosure' , 0.5)
|
||||
, ('CONT_POLY.metal1.enclosure' , 0.5)
|
||||
|
||||
# VIAs (i.e. Metal <--> Metal).
|
||||
, ('VIA12.minimum.side' , 1.0)
|
||||
, ('VIA12.metal1.enclosure' , 0.5)
|
||||
, ('VIA12.metal2.enclosure' , 0.5)
|
||||
, ('VIA23.minimum.side' , 1.0)
|
||||
, ('VIA23.metal2.enclosure' , 0.5)
|
||||
, ('VIA23.metal3.enclosure' , 0.5)
|
||||
, ('VIA34.minimum.side' , 1.0)
|
||||
, ('VIA34.metal3.enclosure' , 0.5)
|
||||
, ('VIA34.metal4.enclosure' , 0.5)
|
||||
, ('VIA45.minimum.side' , 1.0)
|
||||
, ('VIA45.metal4.enclosure' , 0.5)
|
||||
, ('VIA45.metal5.enclosure' , 0.5)
|
||||
, ('VIA56.minimum.side' , 1.0)
|
||||
, ('VIA56.metal5.enclosure' , 0.5)
|
||||
, ('VIA56.metal6.enclosure' , 0.5)
|
||||
, ('VIA67.minimum.side' , 1.0)
|
||||
, ('VIA67.metal6.enclosure' , 0.5)
|
||||
, ('VIA67.metal7.enclosure' , 0.5)
|
||||
, ('VIA78.minimum.side' , 1.0)
|
||||
, ('VIA78.metal7.enclosure' , 0.5)
|
||||
, ('VIA78.metal8.enclosure' , 0.5)
|
||||
|
||||
# Blockages.
|
||||
, ('BLOCKAGE1.minimum.width' , 1.0)
|
||||
, ('BLOCKAGE1.blockage1.extention.cap' , 0.5)
|
||||
, ('BLOCKAGE2.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE2.blockage2.extention.cap' , 0.5)
|
||||
, ('BLOCKAGE3.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE3.blockage3.extention.cap' , 0.5)
|
||||
, ('BLOCKAGE4.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE4.blockage4.extention.cap' , 0.5)
|
||||
, ('BLOCKAGE5.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE5.blockage5.extention.cap' , 1.0)
|
||||
, ('BLOCKAGE6.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE6.blockage6.extention.cap' , 1.0)
|
||||
, ('BLOCKAGE7.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE7.blockage6.extention.cap' , 1.0)
|
||||
, ('BLOCKAGE8.minimum.width' , 2.0)
|
||||
, ('BLOCKAGE8.blockage6.extention.cap' , 1.0)
|
||||
)
|
|
@ -6,4 +6,6 @@ import helpers
|
|||
# - <defaultStyle>
|
||||
# - <stylesTable>
|
||||
|
||||
scale = 0.5
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/display.conf' )
|
||||
|
|
|
@ -21,6 +21,7 @@ parametersTable = \
|
|||
, ('chip.pad.pvssick' , TypeString, 'pvssick_mpx')
|
||||
, ('chip.pad.pvddeck' , TypeString, 'pvddeck_mpx')
|
||||
, ('chip.pad.pvsseck' , TypeString, 'pvsseck_mpx')
|
||||
, ('clockTree.minimumSide' , TypeInt , 700)
|
||||
, ('clockTree.minimumSide' , TypeInt , 1000)
|
||||
, ('clockTree.buffer' , TypeString, 'bf1_x4')
|
||||
, ('clockTree.placerEngine' , TypeString, 'Etesian')
|
||||
)
|
||||
|
|
|
@ -6,4 +6,6 @@ import helpers
|
|||
# - <defaultStyle>
|
||||
# - <stylesTable>
|
||||
|
||||
scale = 0.5
|
||||
|
||||
execfile( helpers.sysConfDir+'/common/display.conf' )
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include "hurricane/UpdateSession.h"
|
||||
#include "crlcore/Utilities.h"
|
||||
#include "crlcore/AllianceFramework.h"
|
||||
#include "crlcore/CellGauge.h"
|
||||
#include "crlcore/ToolBox.h"
|
||||
#include "crlcore/Ispd05Bookshelf.h"
|
||||
|
||||
|
@ -151,6 +152,7 @@ namespace CRL {
|
|||
Cell* Ispd05::load ( string benchmark )
|
||||
{
|
||||
AllianceFramework* af = AllianceFramework::get();
|
||||
pitch = af->getCellGauge()->getPitch();
|
||||
|
||||
UpdateSession::open ();
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ try:
|
|||
from helpers import trace
|
||||
from helpers import ErrorMessage
|
||||
import Mauka
|
||||
import Etesian
|
||||
import Unicorn
|
||||
import plugins
|
||||
import clocktree.ClockTree
|
||||
|
@ -101,9 +102,16 @@ def ScriptMain ( **kw ):
|
|||
ht = clocktree.ClockTree.HTree.create( chip.Configuration.GaugeConfWrapper(chip.Configuration.GaugeConf())
|
||||
, cell, None, cell.getAbutmentBox() )
|
||||
if editor: editor.refresh()
|
||||
|
||||
if Cfg.getParamString('clockTree.placerEngine').asString() != 'Etesian':
|
||||
mauka = Mauka.MaukaEngine.create( cell )
|
||||
mauka.run()
|
||||
mauka.destroy()
|
||||
else:
|
||||
etesian = Etesian.EtesianEngine.create( cell )
|
||||
etesian.place( Etesian.EtesianEngine.SlowMotion )
|
||||
etesian.destroy()
|
||||
|
||||
ht.connectLeaf()
|
||||
ht.prune()
|
||||
ht.route()
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
cmake_minimum_required(VERSION 2.8.9)
|
||||
|
||||
list(INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/")
|
||||
find_package(COLOQUINTE)
|
||||
find_package(Coloquinte REQUIRED)
|
||||
find_package(Bootstrap REQUIRED)
|
||||
setup_project_paths(CORIOLIS)
|
||||
setup_project_paths(COLOQUINTE)
|
||||
|
|
|
@ -0,0 +1,371 @@
|
|||
// -*- C++ -*-
|
||||
//
|
||||
// This file is part of the Coriolis Software.
|
||||
// Copyright (c) UPMC 2015-2015, All Rights Reserved
|
||||
//
|
||||
// +-----------------------------------------------------------------+
|
||||
// | C O R I O L I S |
|
||||
// | E t e s i a n - A n a l y t i c P l a c e r |
|
||||
// | |
|
||||
// | Author : Jean-Paul CHAPUT |
|
||||
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||
// | =============================================================== |
|
||||
// | C++ Module : "./AddFeeds.cpp" |
|
||||
// +-----------------------------------------------------------------+
|
||||
|
||||
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include "hurricane/Error.h"
|
||||
#include "hurricane/Warning.h"
|
||||
#include "hurricane/DataBase.h"
|
||||
#include "hurricane/UpdateSession.h"
|
||||
#include "hurricane/Instance.h"
|
||||
#include "hurricane/Plug.h"
|
||||
#include "hurricane/Path.h"
|
||||
#include "hurricane/viewer/CellWidget.h"
|
||||
#include "crlcore/AllianceFramework.h"
|
||||
#include "crlcore/ToolBox.h"
|
||||
#include "etesian/EtesianEngine.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
using namespace std;
|
||||
using Hurricane::tab;
|
||||
using Hurricane::inltrace;
|
||||
using Hurricane::ltracein;
|
||||
using Hurricane::ltraceout;
|
||||
using Hurricane::ForEachIterator;
|
||||
using Hurricane::Warning;
|
||||
using Hurricane::Error;
|
||||
using Hurricane::DbU;
|
||||
using Hurricane::Box;
|
||||
using Hurricane::Interval;
|
||||
using Hurricane::Instance;
|
||||
using Hurricane::Path;
|
||||
using Hurricane::Transformation;
|
||||
using Hurricane::DataBase;
|
||||
using Hurricane::Cell;
|
||||
using CRL::AllianceFramework;
|
||||
using CRL::CatalogExtension;
|
||||
using CRL::getTransformation;
|
||||
using Etesian::EtesianEngine;
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Class : "::SliceHoles".
|
||||
|
||||
class SliceHoles;
|
||||
|
||||
class Slice {
|
||||
public:
|
||||
Slice ( SliceHoles*, DbU::Unit ybottom, Interval xspan );
|
||||
inline DbU::Unit getYBottom () const;
|
||||
inline const Interval& getXSpan () const;
|
||||
inline DbU::Unit getXMin () const;
|
||||
inline DbU::Unit getXMax () const;
|
||||
inline SliceHoles* getSliceHoles () const;
|
||||
inline EtesianEngine* getEtesian () const;
|
||||
inline size_t getSpinSlice0 () const;
|
||||
void merge ( DbU::Unit source, DbU::Unit target );
|
||||
void addFeeds ( size_t islice );
|
||||
void fillHole ( DbU::Unit xmin, DbU::Unit xmax, DbU::Unit ybottom, size_t yspin );
|
||||
string _getString () const;
|
||||
private:
|
||||
SliceHoles* _sliceHoles;
|
||||
DbU::Unit _ybottom;
|
||||
Interval _xspan;
|
||||
list<Interval> _chunks;
|
||||
};
|
||||
|
||||
|
||||
class SliceHoles {
|
||||
public:
|
||||
SliceHoles ( EtesianEngine* );
|
||||
~SliceHoles ();
|
||||
inline EtesianEngine* getEtesian () const;
|
||||
inline size_t getSpinSlice0 () const;
|
||||
inline void setSpinSlice0 ( size_t );
|
||||
void merge ( const Box& );
|
||||
void addFeeds ();
|
||||
private:
|
||||
EtesianEngine* _etesian;
|
||||
Box _cellAb;
|
||||
DbU::Unit _sliceHeight;
|
||||
vector<Slice*> _slices;
|
||||
size_t _spinSlice0;
|
||||
};
|
||||
|
||||
|
||||
Slice::Slice ( SliceHoles* sliceHoles, DbU::Unit ybottom, Interval xspan )
|
||||
: _sliceHoles(sliceHoles)
|
||||
, _ybottom (ybottom)
|
||||
, _xspan (xspan)
|
||||
, _chunks ()
|
||||
{ }
|
||||
|
||||
inline DbU::Unit Slice::getYBottom () const { return _ybottom; }
|
||||
inline DbU::Unit Slice::getXMin () const { return _xspan.getVMin(); }
|
||||
inline DbU::Unit Slice::getXMax () const { return _xspan.getVMax(); }
|
||||
inline const Interval& Slice::getXSpan () const { return _xspan; }
|
||||
inline SliceHoles* Slice::getSliceHoles () const { return _sliceHoles; }
|
||||
inline EtesianEngine* Slice::getEtesian () const { return getSliceHoles()->getEtesian(); }
|
||||
inline size_t Slice::getSpinSlice0 () const { return getSliceHoles()->getSpinSlice0(); }
|
||||
|
||||
|
||||
void Slice::merge ( DbU::Unit source, DbU::Unit target )
|
||||
{
|
||||
Interval chunkToMerge = _xspan.getIntersection( Interval(source,target) );
|
||||
ltrace(300) << " Slice::merge() " << " " << chunkToMerge << endl;
|
||||
ltrace(300) << " | " << _getString() << endl;
|
||||
|
||||
if (chunkToMerge.isEmpty()) return;
|
||||
|
||||
list<Interval>::iterator imerge = _chunks.end();
|
||||
list<Interval>::iterator ichunk = _chunks.begin();
|
||||
|
||||
while ( ichunk != _chunks.end() ) {
|
||||
if (imerge == _chunks.end()) {
|
||||
if (chunkToMerge.getVMax() < (*ichunk).getVMin()) {
|
||||
ltrace(300) << " | Insert before " << *ichunk << endl;
|
||||
imerge = _chunks.insert( ichunk, chunkToMerge );
|
||||
break;
|
||||
}
|
||||
|
||||
if (chunkToMerge.intersect(*ichunk)) {
|
||||
ltrace(300) << " | Merge with " << *ichunk << endl;
|
||||
imerge = ichunk;
|
||||
(*imerge).merge( chunkToMerge );
|
||||
}
|
||||
} else {
|
||||
if (chunkToMerge.getVMax() >= (*ichunk).getVMin()) {
|
||||
(*imerge).merge( *ichunk );
|
||||
ltrace(300) << " | Absorb (erase) " << *ichunk << endl;
|
||||
ichunk = _chunks.erase( ichunk );
|
||||
continue;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
|
||||
++ichunk;
|
||||
}
|
||||
|
||||
if (imerge == _chunks.end()) {
|
||||
_chunks.insert( ichunk, chunkToMerge );
|
||||
ltrace(300) << " | Insert at end " << DbU::getValueString(_ybottom) << " " << chunkToMerge << endl;
|
||||
ltrace(300) << " | " << _getString() << endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Slice::addFeeds ( size_t islice )
|
||||
{
|
||||
if (_chunks.empty()) {
|
||||
fillHole( getXMin(), getXMax(), getYBottom(), islice%2 );
|
||||
return;
|
||||
}
|
||||
|
||||
list<Interval>::iterator ichunk = _chunks.begin();
|
||||
list<Interval>::iterator ichunknext = ichunk;
|
||||
++ichunknext;
|
||||
|
||||
// Hole before the first chunk.
|
||||
if ((*ichunk).getVMin() > getXMin()) {
|
||||
fillHole( getXMin(), (*ichunk).getVMin(), getYBottom(), (islice+getSpinSlice0())%2 );
|
||||
}
|
||||
|
||||
for ( ; ichunknext != _chunks.end() ; ++ichunk, ++ichunknext ) {
|
||||
fillHole( (*ichunk).getVMax(), (*ichunknext).getVMin(), getYBottom(), (islice+getSpinSlice0())%2 );
|
||||
}
|
||||
|
||||
// Hole after the last chunk.
|
||||
if ((*ichunk).getVMax() < getXMax()) {
|
||||
fillHole( (*ichunk).getVMax(), getXMax(), getYBottom(), (islice+getSpinSlice0())%2 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Slice::fillHole ( DbU::Unit xmin, DbU::Unit xmax, DbU::Unit ybottom, size_t yspin )
|
||||
{
|
||||
Cell* feed = getEtesian()->getFeedCells().getBiggestFeed();
|
||||
if (feed == NULL) {
|
||||
cerr << Error("EtesianEngine: No feed has been registered, ignoring.") << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
DbU::Unit feedWidth = feed->getAbutmentBox().getWidth();
|
||||
DbU::Unit xtie = xmin;
|
||||
|
||||
while ( true ) {
|
||||
if (xtie >= xmax) break;
|
||||
if (xtie+feedWidth > xmax) {
|
||||
// Feed is too big, try to find a smaller one.
|
||||
int pitch = (int)((xmax-xtie) / getEtesian()->getPitch());
|
||||
for ( ; pitch > 0 ; --pitch ) {
|
||||
feed = getEtesian()->getFeedCells().getFeed( pitch );
|
||||
feedWidth = feed->getAbutmentBox().getWidth();
|
||||
if (feed != NULL) break;
|
||||
}
|
||||
if (feed == NULL) break;
|
||||
}
|
||||
|
||||
Instance::create ( getEtesian()->getCell()
|
||||
, getEtesian()->getFeedCells().getUniqueInstanceName().c_str()
|
||||
, feed
|
||||
, getTransformation( feed->getAbutmentBox()
|
||||
, xtie
|
||||
, _ybottom
|
||||
, (yspin)?Transformation::Orientation::MY
|
||||
:Transformation::Orientation::ID
|
||||
)
|
||||
, Instance::PlacementStatus::PLACED
|
||||
);
|
||||
|
||||
xtie += feedWidth;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
string Slice::_getString () const
|
||||
{
|
||||
ostringstream os;
|
||||
|
||||
os << "<Slice " << " @" << DbU::getValueString(_ybottom) << " ";
|
||||
list<Interval>::const_iterator ichunk = _chunks.begin();
|
||||
for ( ; ichunk != _chunks.end() ; ++ichunk ) {
|
||||
if (ichunk != _chunks.begin()) os << " ";
|
||||
os << "[" << DbU::getValueString((*ichunk).getVMin())
|
||||
<< " " << DbU::getValueString((*ichunk).getVMax()) << "]";
|
||||
}
|
||||
os << ">";
|
||||
return os.str();
|
||||
}
|
||||
|
||||
|
||||
SliceHoles::SliceHoles ( EtesianEngine* etesian )
|
||||
: _etesian (etesian)
|
||||
, _cellAb (etesian->getCell()->getAbutmentBox())
|
||||
, _sliceHeight(_etesian->getSliceHeight())
|
||||
, _slices ()
|
||||
{
|
||||
size_t slicesNb = _cellAb.getHeight() / _sliceHeight;
|
||||
for ( size_t islice=0 ; islice<slicesNb ; ++islice )
|
||||
_slices.push_back( new Slice( this
|
||||
, _cellAb.getYMin()+islice*_sliceHeight
|
||||
, Interval(_cellAb.getXMin(),_cellAb.getXMax()) ) );
|
||||
}
|
||||
|
||||
|
||||
SliceHoles::~SliceHoles ()
|
||||
{
|
||||
for ( size_t islice=0 ; islice<_slices.size() ; ++islice )
|
||||
delete _slices[islice];
|
||||
}
|
||||
|
||||
|
||||
inline EtesianEngine* SliceHoles::getEtesian () const { return _etesian; }
|
||||
inline size_t SliceHoles::getSpinSlice0 () const { return _spinSlice0; }
|
||||
inline void SliceHoles::setSpinSlice0 ( size_t spinSlice0 ) { _spinSlice0 = spinSlice0; }
|
||||
|
||||
|
||||
void SliceHoles::merge ( const Box& bb )
|
||||
{
|
||||
if (bb.getYMin() < _cellAb.getYMin()) {
|
||||
cerr << Warning("Attempt to merge instance outside the Cell abutment box.") << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
size_t ibegin = (bb.getYMin()-_cellAb.getYMin()) / _sliceHeight;
|
||||
size_t iend = (bb.getYMax()-_cellAb.getYMin()) / _sliceHeight;
|
||||
|
||||
for ( size_t islice=ibegin ; islice<iend ; ++islice ) {
|
||||
_slices[islice]->merge( bb.getXMin(), bb.getXMax() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SliceHoles::addFeeds ()
|
||||
{
|
||||
for ( size_t islice=0 ; islice<_slices.size() ; islice++ )
|
||||
_slices[islice]->addFeeds( islice );
|
||||
}
|
||||
|
||||
|
||||
} // End of anonymous namespace.
|
||||
|
||||
|
||||
namespace Etesian {
|
||||
|
||||
|
||||
using Hurricane::ForEachIterator;
|
||||
using Hurricane::DataBase;
|
||||
using Hurricane::UpdateSession;
|
||||
using Hurricane::Occurrence;
|
||||
|
||||
|
||||
void EtesianEngine::addFeeds ()
|
||||
{
|
||||
UpdateSession::open();
|
||||
|
||||
bool yspinSet = false;
|
||||
size_t yspinSlice0 = 0;
|
||||
SliceHoles sliceHoles ( this );
|
||||
|
||||
forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() )
|
||||
{
|
||||
Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity());
|
||||
Cell* masterCell = instance->getMasterCell();
|
||||
|
||||
if (CatalogExtension::isFeed(masterCell)) {
|
||||
cerr << Warning( "Feed instance %s already present."
|
||||
, getString(instance->getName()).c_str() ) << endl;
|
||||
}
|
||||
|
||||
Box instanceAb = masterCell->getAbutmentBox();
|
||||
|
||||
Transformation instanceTransf = instance->getTransformation();
|
||||
(*ioccurrence).getPath().getTransformation().applyOn( instanceTransf );
|
||||
instanceTransf.applyOn( instanceAb );
|
||||
|
||||
if (not yspinSet) {
|
||||
yspinSet = true;
|
||||
|
||||
int islice = (instanceAb.getYMin() - getCell()->getAbutmentBox().getYMin()) / getSliceHeight();
|
||||
|
||||
switch ( instanceTransf.getOrientation() ) {
|
||||
case Transformation::Orientation::ID:
|
||||
case Transformation::Orientation::MX:
|
||||
yspinSlice0 = (islice % 2);
|
||||
break;
|
||||
case Transformation::Orientation::R2:
|
||||
case Transformation::Orientation::MY:
|
||||
yspinSlice0 = ((islice+1) % 2);
|
||||
break;
|
||||
case Transformation::Orientation::R1:
|
||||
case Transformation::Orientation::R3:
|
||||
case Transformation::Orientation::XR:
|
||||
case Transformation::Orientation::YR:
|
||||
cerr << Warning( "Instance %s has invalid transformation %s."
|
||||
, getString(instance->getName()).c_str()
|
||||
, getString(instanceTransf.getOrientation()).c_str()
|
||||
) << endl;
|
||||
yspinSet = false;
|
||||
break;
|
||||
}
|
||||
|
||||
sliceHoles.setSpinSlice0( yspinSlice0 );
|
||||
}
|
||||
|
||||
sliceHoles.merge( instanceAb );
|
||||
}
|
||||
|
||||
sliceHoles.addFeeds();
|
||||
|
||||
UpdateSession::close();
|
||||
|
||||
if (_cellWidget) _cellWidget->refresh();
|
||||
}
|
||||
|
||||
|
||||
} // Kite namespace.
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
include_directories ( ${ETESIAN_SOURCE_DIR}/src
|
||||
${COLOQUINTE_INCLUDE_DIR}
|
||||
${EIGEN3_INCLUDE_DIR}
|
||||
${CORIOLIS_INCLUDE_DIR}
|
||||
${HURRICANE_INCLUDE_DIR}
|
||||
${CONFIGURATION_INCLUDE_DIR}
|
||||
|
@ -12,27 +11,8 @@
|
|||
${Boost_INCLUDE_DIRS}
|
||||
${PYTHON_INCLUDE_PATH}
|
||||
)
|
||||
set ( includes #etesian/Constants.h
|
||||
#etesian/TrackCost.h
|
||||
#etesian/DataNegociate.h
|
||||
#etesian/TrackElement.h etesian/TrackElements.h
|
||||
#etesian/TrackSegment.h
|
||||
#etesian/TrackFixedSegment.h
|
||||
#etesian/TrackMarker.h
|
||||
#etesian/Track.h
|
||||
#etesian/Tracks.h
|
||||
#etesian/HorizontalTrack.h
|
||||
#etesian/VerticalTrack.h
|
||||
#etesian/RoutingPlane.h
|
||||
#etesian/Session.h
|
||||
#etesian/Manipulator.h
|
||||
#etesian/SegmentFsm.h
|
||||
#etesian/RoutingEvent.h
|
||||
#etesian/RoutingEventQueue.h
|
||||
#etesian/RoutingEventHistory.h
|
||||
#etesian/RoutingEventLoop.h
|
||||
#etesian/NegociateWindow.h
|
||||
etesian/Configuration.h
|
||||
set ( includes etesian/Configuration.h
|
||||
etesian/FeedCells.h
|
||||
etesian/EtesianEngine.h
|
||||
etesian/GraphicEtesianEngine.h
|
||||
)
|
||||
|
@ -40,30 +20,9 @@
|
|||
etesian/PyGraphicEtesianEngine.h
|
||||
)
|
||||
set ( mocIncludes etesian/GraphicEtesianEngine.h )
|
||||
set ( cpps #TrackCost.cpp
|
||||
#DataNegociate.cpp
|
||||
#TrackElement.cpp
|
||||
#TrackElements.cpp
|
||||
#TrackSegment.cpp
|
||||
#TrackFixedSegment.cpp
|
||||
#TrackMarker.cpp
|
||||
#Track.cpp
|
||||
#Tracks.cpp
|
||||
#HorizontalTrack.cpp
|
||||
#VerticalTrack.cpp
|
||||
#RoutingPlane.cpp
|
||||
#Session.cpp
|
||||
#Manipulator.cpp
|
||||
#SegmentFsm.cpp
|
||||
#RoutingEvent.cpp
|
||||
#RoutingEventQueue.cpp
|
||||
#RoutingEventHistory.cpp
|
||||
#RoutingEventLoop.cpp
|
||||
#NegociateWindow.cpp
|
||||
#BuildPowerRails.cpp
|
||||
#ProtectRoutingPads.cpp
|
||||
#PreProcess.cpp
|
||||
Configuration.cpp
|
||||
set ( cpps Configuration.cpp
|
||||
AddFeeds.cpp
|
||||
FeedCells.cpp
|
||||
EtesianEngine.cpp
|
||||
GraphicEtesianEngine.cpp
|
||||
)
|
||||
|
@ -71,7 +30,6 @@
|
|||
PyEtesianEngine.cpp
|
||||
PyGraphicEtesianEngine.cpp
|
||||
)
|
||||
# set ( etesiancpps EtesianMain.cpp )
|
||||
qtX_wrap_cpp ( mocCpps ${mocIncludes} )
|
||||
|
||||
add_library ( etesian ${cpps} ${mocCpps} ${pyCpps} )
|
||||
|
|
|
@ -24,9 +24,10 @@
|
|||
#include "hurricane/DataBase.h"
|
||||
#include "hurricane/Cell.h"
|
||||
#include "crlcore/Utilities.h"
|
||||
#include "crlcore/RoutingLayerGauge.h"
|
||||
#include "crlcore/CellGauge.h"
|
||||
#include "crlcore/AllianceFramework.h"
|
||||
#include "etesian/Configuration.h"
|
||||
#include "etesian/EtesianEngine.h"
|
||||
|
||||
|
||||
|
||||
|
@ -45,8 +46,7 @@ namespace Etesian {
|
|||
using Hurricane::Technology;
|
||||
using Hurricane::DataBase;
|
||||
using CRL::AllianceFramework;
|
||||
using CRL::RoutingGauge;
|
||||
using CRL::RoutingLayerGauge;
|
||||
using CRL::CellGauge;
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
|
@ -61,43 +61,44 @@ namespace Etesian {
|
|||
// Class : "Etesian::ConfigurationConcrete".
|
||||
|
||||
|
||||
ConfigurationConcrete::ConfigurationConcrete ( const RoutingGauge* rg )
|
||||
ConfigurationConcrete::ConfigurationConcrete ( const CellGauge* cg )
|
||||
: Configuration()
|
||||
, _rg (NULL)
|
||||
, _cg (NULL)
|
||||
, _flags (0)
|
||||
{
|
||||
if ( rg == NULL ) rg = AllianceFramework::get()->getRoutingGauge();
|
||||
if ( cg == NULL ) cg = AllianceFramework::get()->getCellGauge();
|
||||
|
||||
_rg = rg->getClone();
|
||||
_cg = cg->getClone();
|
||||
}
|
||||
|
||||
|
||||
ConfigurationConcrete::ConfigurationConcrete ( const ConfigurationConcrete& other )
|
||||
: Configuration()
|
||||
, _rg (NULL)
|
||||
, _cg (NULL)
|
||||
, _flags (other._flags)
|
||||
{
|
||||
if ( other._rg ) _rg = other._rg->getClone();
|
||||
if ( other._cg ) _cg = other._cg->getClone();
|
||||
}
|
||||
|
||||
|
||||
ConfigurationConcrete::~ConfigurationConcrete ()
|
||||
{
|
||||
ltrace(89) << "About to delete attribute _rg (RoutingGauge)." << endl;
|
||||
_rg->destroy ();
|
||||
ltrace(89) << "About to delete attribute _cg (CellGauge)." << endl;
|
||||
_cg->destroy ();
|
||||
}
|
||||
|
||||
|
||||
ConfigurationConcrete* ConfigurationConcrete::clone () const
|
||||
{ return new ConfigurationConcrete(*this); }
|
||||
|
||||
|
||||
RoutingGauge* ConfigurationConcrete::getRoutingGauge () const
|
||||
{ return _rg; }
|
||||
ConfigurationConcrete* ConfigurationConcrete::clone () const { return new ConfigurationConcrete(*this); }
|
||||
CellGauge* ConfigurationConcrete::getCellGauge () const { return _cg; }
|
||||
bool ConfigurationConcrete::isSlowMotion () const { return _flags & EtesianEngine::SlowMotion; }
|
||||
void ConfigurationConcrete::setFlags ( unsigned int flags ) { _flags |= flags; }
|
||||
void ConfigurationConcrete::unsetFlags ( unsigned int flags ) { _flags &= ~flags; }
|
||||
|
||||
|
||||
void ConfigurationConcrete::print ( Cell* cell ) const
|
||||
{
|
||||
cout << " o Configuration of ToolEngine<Etesian> for Cell <" << cell->getName() << ">" << endl;
|
||||
cout << Dots::asIdentifier(" - Routing Gauge" ,getString(_rg->getName())) << endl;
|
||||
cout << Dots::asIdentifier(" - Cell Gauge",getString(_cg->getName())) << endl;
|
||||
}
|
||||
|
||||
|
||||
|
@ -109,7 +110,7 @@ namespace Etesian {
|
|||
{
|
||||
ostringstream os;
|
||||
|
||||
os << "<" << _getTypeName() << " " << _rg->getName() << ">";
|
||||
os << "<" << _getTypeName() << " " << _cg->getName() << ">";
|
||||
|
||||
return os.str();
|
||||
}
|
||||
|
@ -118,7 +119,7 @@ namespace Etesian {
|
|||
Record* ConfigurationConcrete::_getRecord () const
|
||||
{
|
||||
Record* record = new Record ( _getString() );
|
||||
record->add ( getSlot ( "_rg" , _rg ) );
|
||||
record->add ( getSlot ( "_cg" , _cg ) );
|
||||
|
||||
return ( record );
|
||||
}
|
||||
|
|
|
@ -18,7 +18,8 @@
|
|||
#include <fstream>
|
||||
#include <iomanip>
|
||||
#if HAVE_COLOQUINTE
|
||||
#include "coloquinte/circuit_graph.hxx"
|
||||
#include "Coloquinte/circuit.hxx"
|
||||
#include "Coloquinte/legalizer.hxx"
|
||||
#endif
|
||||
#include "vlsisapd/utilities/Dots.h"
|
||||
#include "hurricane/DebugSession.h"
|
||||
|
@ -42,15 +43,23 @@
|
|||
#include "crlcore/Measures.h"
|
||||
#include "crlcore/AllianceFramework.h"
|
||||
#include "etesian/EtesianEngine.h"
|
||||
#include "etesian/FeedCells.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
using namespace std;
|
||||
using namespace Hurricane;
|
||||
using coloquinte::float_t;
|
||||
using coloquinte::point;
|
||||
|
||||
|
||||
|
||||
|
||||
#if HAVE_COLOQUINTE
|
||||
inline bool isNan( const float_t& f ) { return (f != f); }
|
||||
|
||||
|
||||
string extractInstanceName ( const RoutingPad* rp )
|
||||
{
|
||||
ostringstream name;
|
||||
|
@ -102,6 +111,7 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
#if 0
|
||||
Coloquinte::cell::pin::pin_dir extractDirection ( const RoutingPad* rp )
|
||||
{
|
||||
switch ( rp->_getEntityAsComponent()->getNet()->getDirection() ) {
|
||||
|
@ -114,6 +124,7 @@ namespace {
|
|||
|
||||
return Coloquinte::cell::pin::O;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Point extractRpOffset ( const RoutingPad* rp )
|
||||
|
@ -129,6 +140,38 @@ namespace {
|
|||
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
||||
Transformation toTransformation ( point<float_t> position
|
||||
, point<float_t> orientation
|
||||
, Cell* model
|
||||
, DbU::Unit pitch
|
||||
)
|
||||
{
|
||||
DbU::Unit tx = position.x_ * pitch;
|
||||
DbU::Unit ty = position.y_ * pitch;
|
||||
Point center = model->getAbutmentBox().getCenter();
|
||||
Transformation::Orientation orient = Transformation::Orientation::ID;
|
||||
|
||||
if ( (orientation.x_ >= 0) and (orientation.y_ >= 0) ) {
|
||||
tx += - center.getX();
|
||||
ty += - center.getY();
|
||||
} else if ( (orientation.x_ < 0) and (orientation.y_ >= 0) ) {
|
||||
tx += center.getX();
|
||||
ty += - center.getY();
|
||||
orient = Transformation::Orientation::MX;
|
||||
} else if ( (orientation.x_ >= 0) and (orientation.y_ < 0) ) {
|
||||
tx += - center.getX();
|
||||
ty += center.getY();
|
||||
orient = Transformation::Orientation::MY;
|
||||
} else if ( (orientation.x_ < 0) and (orientation.y_ < 0) ) {
|
||||
tx += center.getX();
|
||||
ty += center.getY();
|
||||
orient = Transformation::Orientation::R2;
|
||||
}
|
||||
|
||||
return Transformation( tx, ty, orient );
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -172,11 +215,31 @@ namespace Etesian {
|
|||
using Hurricane::CellWidget;
|
||||
using CRL::ToolEngine;
|
||||
using CRL::AllianceFramework;
|
||||
using CRL::Catalog;
|
||||
using CRL::addMeasure;
|
||||
using CRL::Measures;
|
||||
using CRL::MeasuresSet;
|
||||
using CRL::CatalogExtension;
|
||||
|
||||
using coloquinte::index_t;
|
||||
using coloquinte::capacity_t;
|
||||
using coloquinte::int_t;
|
||||
using coloquinte::float_t;
|
||||
using coloquinte::point;
|
||||
using coloquinte::box;
|
||||
using coloquinte::Movability;
|
||||
using coloquinte::temporary_cell;
|
||||
using coloquinte::temporary_net;
|
||||
using coloquinte::temporary_pin;
|
||||
using coloquinte::netlist;
|
||||
using coloquinte::gp::placement_t;
|
||||
using coloquinte::gp::get_rough_legalizer;
|
||||
using coloquinte::gp::get_star_linear_system;
|
||||
using coloquinte::gp::get_result;
|
||||
using coloquinte::dp::legalize;
|
||||
using coloquinte::dp::swaps_global;
|
||||
using coloquinte::dp::swaps_row;
|
||||
using coloquinte::dp::OSRP_convex;
|
||||
using coloquinte::dp::row_compatible_orientation;
|
||||
|
||||
const char* missingEtesian =
|
||||
"%s :\n\n"
|
||||
|
@ -199,16 +262,27 @@ namespace Etesian {
|
|||
|
||||
EtesianEngine::EtesianEngine ( Cell* cell )
|
||||
: ToolEngine (cell)
|
||||
, _configuration(NULL)
|
||||
, _configuration(new ConfigurationConcrete())
|
||||
, _flags (0)
|
||||
, _circuit (NULL)
|
||||
, _timer ()
|
||||
, _surface ()
|
||||
, _circuit ()
|
||||
, _placementLB ()
|
||||
, _placementUB ()
|
||||
, _cellsToIds ()
|
||||
, _idsToInsts ()
|
||||
, _cellWidget (NULL)
|
||||
, _feedCells (this)
|
||||
{ }
|
||||
|
||||
|
||||
void EtesianEngine::_postCreate ()
|
||||
{ }
|
||||
{
|
||||
// Ugly. Direct uses of Alliance Framework.
|
||||
// Must change toward something in the settings.
|
||||
_feedCells.useFeed( AllianceFramework::get()->getCell("tie_x0" ,Catalog::State::Views) );
|
||||
_feedCells.useFeed( AllianceFramework::get()->getCell("rowend_x0",Catalog::State::Views) );
|
||||
}
|
||||
|
||||
|
||||
EtesianEngine* EtesianEngine::create ( Cell* cell )
|
||||
|
@ -234,9 +308,6 @@ namespace Etesian {
|
|||
|
||||
EtesianEngine::~EtesianEngine ()
|
||||
{
|
||||
#if HAVE_COLOQUINTE
|
||||
if (_circuit) delete _circuit;
|
||||
#endif
|
||||
delete _configuration;
|
||||
}
|
||||
|
||||
|
@ -245,10 +316,41 @@ namespace Etesian {
|
|||
{ return _toolName; }
|
||||
|
||||
|
||||
const Configuration* EtesianEngine::getConfiguration () const
|
||||
{ return _configuration; }
|
||||
|
||||
|
||||
Configuration* EtesianEngine::getConfiguration ()
|
||||
{ return _configuration; }
|
||||
|
||||
|
||||
void EtesianEngine::startMeasures ()
|
||||
{
|
||||
_timer.resetIncrease();
|
||||
_timer.start();
|
||||
}
|
||||
|
||||
|
||||
void EtesianEngine::stopMeasures ()
|
||||
{ _timer.stop(); }
|
||||
|
||||
|
||||
void EtesianEngine::printMeasures ( string tag ) const
|
||||
{
|
||||
ostringstream result;
|
||||
|
||||
result << Timer::getStringTime(_timer.getCombTime()) << ", "
|
||||
<< Timer::getStringMemory(_timer.getIncrease());
|
||||
cmess1 << ::Dots::asString( " - Done in", result.str() ) << endl;
|
||||
|
||||
result.str("");
|
||||
result << _timer.getCombTime()
|
||||
<< "s, +" << (_timer.getIncrease()>>10) << "Kb/"
|
||||
<< (_timer.getMemorySize()>>10) << "Kb";
|
||||
cmess2 << ::Dots::asString( " - Raw measurements", result.str() ) << endl;
|
||||
}
|
||||
|
||||
|
||||
void EtesianEngine::resetPlacement ()
|
||||
{
|
||||
//cerr << "EtesianEngine::resetPlacement()" << endl;
|
||||
|
@ -293,7 +395,7 @@ namespace Etesian {
|
|||
}
|
||||
|
||||
|
||||
void EtesianEngine::place ( unsigned int slowMotion )
|
||||
void EtesianEngine::toColoquinte ()
|
||||
{
|
||||
#if HAVE_COLOQUINTE
|
||||
cmess1 << " o Converting <" << getCell()->getName() << "> into Coloquinte." << endl;
|
||||
|
@ -302,6 +404,7 @@ namespace Etesian {
|
|||
|
||||
Dots dots ( cmess2, " ", 80, 1000 );
|
||||
AllianceFramework* af = AllianceFramework::get();
|
||||
DbU::Unit pitch = getPitch();
|
||||
|
||||
cmess1 << " - Building RoutingPads (transhierarchical) ..." << endl;
|
||||
getCell()->flattenNets( Cell::BuildRings );
|
||||
|
@ -309,15 +412,29 @@ namespace Etesian {
|
|||
// Coloquinte circuit description data-structures.
|
||||
size_t instancesNb = getCell()->getLeafInstanceOccurrences().getSize();
|
||||
vector<Transformation> idsToTransf ( instancesNb );
|
||||
vector<temporary_cell> instances ( instancesNb );
|
||||
vector< point<float_t> > positions ( instancesNb );
|
||||
vector< point<float_t> > orientations( instancesNb, point<float_t>(1.0,1.0) );
|
||||
|
||||
_circuit = new Coloquinte::circuit();
|
||||
_circuit->cells .resize( instancesNb );
|
||||
_circuit->hypernets.resize( getCell()->getNets().getSize() );
|
||||
|
||||
cmess1 << " - Converting Instances (Bookshelf nodes)" << endl;
|
||||
cmess1 << " - Converting " << instancesNb << " instances" << endl;
|
||||
cout.flush();
|
||||
|
||||
Coloquinte::cell_id cellId = 0;
|
||||
Box topAb = getCell()->getAbutmentBox();
|
||||
|
||||
UpdateSession::open();
|
||||
forEach ( Occurrence, ioccurrence, getCell()->getNonLeafInstanceOccurrences() )
|
||||
{
|
||||
Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity());
|
||||
Cell* masterCell = instance->getMasterCell();
|
||||
|
||||
// Have to check here if the model is fully placed or not.
|
||||
masterCell->setAbutmentBox( topAb );
|
||||
instance->setTransformation( Transformation() ); // (0,0,ID).
|
||||
instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
||||
}
|
||||
UpdateSession::close();
|
||||
|
||||
index_t instanceId = 0;
|
||||
forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() )
|
||||
{
|
||||
Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity());
|
||||
|
@ -327,32 +444,48 @@ namespace Etesian {
|
|||
instanceName.erase( 0, 1 );
|
||||
instanceName.erase( instanceName.size()-1 );
|
||||
|
||||
if (CatalogExtension::isFeed(masterCell)) continue;
|
||||
if (CatalogExtension::isFeed(masterCell)) {
|
||||
cerr << Warning("Feed instance found and skipped.") << endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
Box instanceAb = masterCell->getAbutmentBox();
|
||||
|
||||
Coloquinte::circuit_coordinate cellSize ( masterCell->getAbutmentBox().getWidth () / DbU::fromLambda(5.0)
|
||||
, masterCell->getAbutmentBox().getHeight() / DbU::fromLambda(5.0) );
|
||||
_cellsToIds.insert( make_pair(instanceName,cellId) );
|
||||
Transformation instanceTransf = instance->getTransformation();
|
||||
(*ioccurrence).getPath().getTransformation().applyOn( instanceTransf );
|
||||
idsToTransf[cellId] = instanceTransf;
|
||||
instanceTransf.applyOn( instanceAb );
|
||||
|
||||
double xsize = instanceAb.getWidth () / pitch;
|
||||
double ysize = instanceAb.getHeight() / pitch;
|
||||
double xpos = instanceAb.getCenter().getX() / pitch;
|
||||
double ypos = instanceAb.getCenter().getY() / pitch;
|
||||
|
||||
instances[instanceId].size = point<int_t>( xsize, ysize );
|
||||
instances[instanceId].list_index = instanceId;
|
||||
instances[instanceId].area = static_cast<capacity_t>(xsize) * static_cast<capacity_t>(ysize);
|
||||
positions[instanceId] = point<float_t>( xpos, ypos );
|
||||
|
||||
if ( not instance->isFixed() and instance->isTerminal() ) {
|
||||
instances[instanceId].attributes = coloquinte::XMovable
|
||||
|coloquinte::YMovable
|
||||
|coloquinte::XFlippable
|
||||
|coloquinte::YFlippable;
|
||||
} else {
|
||||
instances[instanceId].attributes = 0;
|
||||
}
|
||||
|
||||
_cellsToIds.insert( make_pair(instanceName,instanceId) );
|
||||
_idsToInsts.push_back( instance );
|
||||
++instanceId;
|
||||
dots.dot();
|
||||
//cerr << instanceName << " " << (int)instance->getPlacementStatus().getCode()
|
||||
// << " area:" << cellSize.cast<Coloquinte::cell_area>().prod() << endl;
|
||||
|
||||
_circuit->cells[cellId].name = instanceName;
|
||||
_circuit->cells[cellId].sizes = cellSize;
|
||||
_circuit->cells[cellId].area = cellSize.cast<Coloquinte::cell_area>().prod();
|
||||
_circuit->cells[cellId].movable = not instance->isFixed() and instance->isTerminal();
|
||||
//if (not _circuit->cells[cellId].movable)
|
||||
// cerr << "FIXED (movable=false):" << instance << endl;
|
||||
//_circuit->cells[cellId].movable = (instance->getPlacementStatus() == Instance::PlacementStatus::UNPLACED);
|
||||
|
||||
cellId++;
|
||||
}
|
||||
dots.finish( Dots::Reset|Dots::FirstDot );
|
||||
|
||||
cmess1 << " - Converting Nets (Bookshelf nets)" << endl;
|
||||
size_t netsNb = getCell()->getNets().getSize();
|
||||
cmess1 << " - Converting " << netsNb << " nets" << endl;
|
||||
|
||||
vector<temporary_net> nets ( netsNb );
|
||||
vector<temporary_pin> pins;
|
||||
|
||||
unsigned int netId = 0;
|
||||
forEach ( Net*, inet, getCell()->getNets() )
|
||||
|
@ -369,32 +502,20 @@ namespace Etesian {
|
|||
if (af->isBLOCKAGE((*inet)->getName())) continue;
|
||||
|
||||
dots.dot();
|
||||
//cerr << (*inet)->getName() << endl;
|
||||
|
||||
nets[netId] = temporary_net( netId, 1.0 );
|
||||
|
||||
forEach ( RoutingPad*, irp, (*inet)->getRoutingPads() ) {
|
||||
//cerr << " " << (*irp)->getOccurrence().getCompactString() << endl;
|
||||
string insName = extractInstanceName( *irp );
|
||||
Point offset = extractRpOffset ( *irp );
|
||||
|
||||
//cerr << " Master Cell: " << (*irp)->getOccurrence().getMasterCell() << endl;
|
||||
//cerr << " Rebuilt instance name: " << insName << " " << offset << endl;
|
||||
double xpin = offset.getX() / pitch;
|
||||
double ypin = offset.getY() / pitch;
|
||||
|
||||
auto iid = _cellsToIds.find( insName );
|
||||
if (iid == _cellsToIds.end() ) {
|
||||
cerr << Error( "Unable to lookup instance <%s>.", insName.c_str() ) << endl;
|
||||
} else {
|
||||
Coloquinte::cell_id cellId = (*iid).second;
|
||||
Coloquinte::hypernet::pin_id netPinId ( cellId, _circuit->cells [cellId].pins.size() );
|
||||
Coloquinte::cell::pin_id cellPinId ( netId , _circuit->hypernets[netId ].pins.size() );
|
||||
_circuit->hypernets[netId].pins.push_back( netPinId );
|
||||
|
||||
Coloquinte::cell::pin cellPin;
|
||||
//cellPin.name = extractTerminalName( *irp );
|
||||
cellPin.d = extractDirection ( *irp );
|
||||
cellPin.offs.x() = offset.getX() / DbU::fromLambda(5.0);
|
||||
cellPin.offs.y() = offset.getY() / DbU::fromLambda(5.0);
|
||||
cellPin.ind = cellPinId;
|
||||
_circuit->cells[cellId].pins.push_back( cellPin );
|
||||
pins.push_back( temporary_pin( point<float_t>(xpin,ypin), (*iid).second, netId ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -402,110 +523,186 @@ namespace Etesian {
|
|||
}
|
||||
dots.finish( Dots::Reset );
|
||||
|
||||
_circuit->position_overlays.resize(1);
|
||||
_circuit->position_overlays[0].x_pos = Coloquinte::circuit_vector( _cellsToIds.size() );
|
||||
_circuit->position_overlays[0].y_pos = Coloquinte::circuit_vector( _cellsToIds.size() );
|
||||
_surface = box<int_t>( (int_t)(getCell()->getAbutmentBox().getXMin() / pitch)
|
||||
, (int_t)(getCell()->getAbutmentBox().getXMax() / pitch)
|
||||
, (int_t)(getCell()->getAbutmentBox().getYMin() / pitch)
|
||||
, (int_t)(getCell()->getAbutmentBox().getYMax() / pitch)
|
||||
);
|
||||
_circuit = netlist( instances, nets, pins );
|
||||
_placementLB.positions_ = positions;
|
||||
_placementLB.orientations_ = orientations;
|
||||
_placementUB = _placementLB;
|
||||
cerr << "Coloquinte cell height: " << _circuit.get_cell(0).size.y_ << endl;
|
||||
|
||||
for ( auto ipair : _cellsToIds ) {
|
||||
Coloquinte::circuit_coordinate position ( idsToTransf[ipair.second].getTx() / DbU::fromLambda(5.0)
|
||||
, idsToTransf[ipair.second].getTy() / DbU::fromLambda(5.0) );
|
||||
// if (not _circuit->cells[ipair.second].movable) {
|
||||
// cerr << _circuit->cells[ipair.second].name << endl;
|
||||
// cerr << " " << idsToTransf[ipair.second] << endl;
|
||||
// cerr << " Fixed cell BEFORE @" << position.x() << "x" << position.y() << endl;
|
||||
// }
|
||||
//position += _circuit->cells[ipair.second].get_sizes() / 2;
|
||||
_circuit->position_overlays[0].x_pos[ipair.second] = position.x();
|
||||
_circuit->position_overlays[0].y_pos[ipair.second] = position.y();
|
||||
|
||||
// if (not _circuit->cells[ipair.second].movable) {
|
||||
// cerr << " Fixed cell @" << position.x() << "x" << position.y() << endl;
|
||||
// }
|
||||
#endif // HAVE_COLOQUINTE
|
||||
}
|
||||
|
||||
// Temporarily force the circuit size.
|
||||
// getCell()->setAbutmentBox( Box( DbU::fromLambda(0.0)
|
||||
// , DbU::fromLambda(0.0)
|
||||
// , DbU::fromLambda(5.0)*12000
|
||||
// , DbU::fromLambda(5.0)*12000
|
||||
// ) );
|
||||
// _circuit->bounds = Coloquinte::circuit_box( Coloquinte::circuit_coordinate::Zero()
|
||||
// , Coloquinte::circuit_coordinate({12000, 12000}) );
|
||||
_circuit->bounds = Coloquinte::circuit_box
|
||||
( Coloquinte::circuit_coordinate( { getCell()->getAbutmentBox().getXMin() / DbU::fromLambda(5.0)
|
||||
, getCell()->getAbutmentBox().getYMin() / DbU::fromLambda(5.0) } )
|
||||
, Coloquinte::circuit_coordinate( { getCell()->getAbutmentBox().getXMax() / DbU::fromLambda(5.0)
|
||||
, getCell()->getAbutmentBox().getYMax() / DbU::fromLambda(5.0) } ));
|
||||
void EtesianEngine::place ( unsigned int flags )
|
||||
{
|
||||
#if HAVE_COLOQUINTE
|
||||
if (flags & SlowMotion) getConfiguration()-> setFlags( SlowMotion );
|
||||
else getConfiguration()->unsetFlags( SlowMotion );
|
||||
|
||||
_circuit->selfcheck();
|
||||
toColoquinte();
|
||||
|
||||
cmess1 << " o Running Coloquinte." << endl;
|
||||
cmess1 << " - Computing initial placement..." << endl;
|
||||
cmess2 << setfill('0') << right;
|
||||
|
||||
|
||||
double sliceHeight = getSliceHeight() / getPitch();
|
||||
time_t startTime = time(NULL);
|
||||
time_t timeDelta;
|
||||
Coloquinte::circuit_scalar upperBound;
|
||||
Coloquinte::circuit_scalar lowerBound;
|
||||
ostringstream label;
|
||||
|
||||
for ( int j = 0; j < 3; j++ ) {
|
||||
_circuit->position_overlays[0]
|
||||
= Coloquinte::solve_quadratic_model( *_circuit
|
||||
, _circuit->position_overlays[0]
|
||||
, _circuit->position_overlays[0]
|
||||
);
|
||||
cmess2 << " o Initial wirelength " << get_HPWL_wirelength(_circuit, _placementLB) << "." << endl;
|
||||
startMeasures();
|
||||
|
||||
auto first_legalizer = get_rough_legalizer( _circuit, _placementLB, _surface);
|
||||
first_legalizer.selfcheck();
|
||||
|
||||
cmess1 << " o Simple legalization." << endl;
|
||||
get_result( _circuit, _placementUB, first_legalizer);
|
||||
|
||||
timeDelta = time(NULL) - startTime;
|
||||
lowerBound = B2B_wirelength( *_circuit, _circuit->position_overlays[0] );
|
||||
cmess2 << " Iteration " << setw( 4) << (j+1)
|
||||
<< " Elapsed time:" << setw( 5) << timeDelta << "s"
|
||||
<< " Lower bound:" << setw(10)
|
||||
<< lowerBound << endl;
|
||||
cmess2 << " - Elapsed time:" << timeDelta
|
||||
<< " HPWL:" << get_HPWL_wirelength( _circuit, _placementUB )
|
||||
<< "\n "
|
||||
<< "- Linear Disrupt.:" << get_mean_linear_disruption ( _circuit, _placementLB, _placementLB )
|
||||
<< " Quad. Disrupt.:" << get_mean_quadratic_disruption( _circuit, _placementLB, _placementLB )
|
||||
<< endl;
|
||||
_placementLB = _placementUB;
|
||||
_placementLB.selfcheck();
|
||||
|
||||
_updatePlacement( 0 );
|
||||
zero_orientations( _circuit, _placementLB );
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
// cerr << _idsToInsts[1266]
|
||||
// << " x:" << _placementLB.positions_[1095].x_
|
||||
// << " y:" << _placementLB.positions_[1095].y_
|
||||
// << endl;
|
||||
|
||||
// Breakpoint::get()->stop( 0, "After " );
|
||||
|
||||
// Early topology-independent solution
|
||||
cmess1 << " o Star (*) Optimization." << endl;
|
||||
auto solv = get_star_linear_system( _circuit, _placementLB, 1.0, 0, 10000);
|
||||
get_result( _circuit, _placementLB, solv, 200 );
|
||||
_progressReport2( startTime, " [--]" );
|
||||
|
||||
for ( int i=0; i<10; ++i ) {
|
||||
auto solv = get_HPWLF_linear_system( _circuit, _placementLB, 1.0, 2, 100000 );
|
||||
get_result( _circuit, _placementLB, solv, 300 ); // number of iterations
|
||||
|
||||
label.str("");
|
||||
label << " [" << setw(2) << setfill('0') << i << "]";
|
||||
_progressReport2( startTime, label.str() );
|
||||
_updatePlacement( _placementLB );
|
||||
}
|
||||
|
||||
float strength = 0.000001;
|
||||
float strength_incr = 0.000002;
|
||||
float_t pulling_force = 0.03;
|
||||
|
||||
cmess1 << " - Optimizing placement..." << endl;
|
||||
cmess2 << " o Simple legalization." << endl;
|
||||
for ( int i=0; i<50; ++i, pulling_force += 0.03 ) {
|
||||
// Create a legalizer and bipartition it until we have sufficient precision
|
||||
// (~2 to 10 standard cell widths).
|
||||
auto legalizer = get_rough_legalizer( _circuit, _placementLB, _surface );
|
||||
for ( int quad_part=0 ; quad_part<8 ; quad_part++ ) {
|
||||
legalizer.x_bipartition();
|
||||
legalizer.y_bipartition();
|
||||
legalizer.redo_line_partitions();
|
||||
legalizer.redo_diagonal_bipartitions();
|
||||
legalizer.redo_line_partitions();
|
||||
legalizer.redo_diagonal_bipartitions();
|
||||
legalizer.selfcheck();
|
||||
}
|
||||
if (i < 10) {
|
||||
spread_orientations( _circuit, _placementLB );
|
||||
}
|
||||
// Keep the orientation between LB and UB
|
||||
_placementUB = _placementLB;
|
||||
|
||||
_circuit->position_overlays.resize(2);
|
||||
for ( int j = 0; j < 200; j++, strength = strength * 1.02 + strength_incr) {
|
||||
_circuit->position_overlays[1]
|
||||
= Coloquinte::legalize( *_circuit
|
||||
, 1.0
|
||||
, _circuit->position_overlays[0]
|
||||
, 1
|
||||
, false
|
||||
);
|
||||
get_result( _circuit, _placementUB, legalizer );
|
||||
label.str("");
|
||||
label << " [" << setw(2) << setfill('0') << i << "] Bipart.";
|
||||
_progressReport1( startTime, label.str() );
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
timeDelta = time(NULL) - startTime;
|
||||
upperBound = B2B_wirelength( *_circuit, _circuit->position_overlays[1] );
|
||||
cmess2 << " Iteration " << setw( 4) << (j+1)
|
||||
<< " Elapsed time:" << setw( 5) << timeDelta << "s"
|
||||
<< " UPPER bound:" << setw(10)
|
||||
<< upperBound << endl;
|
||||
|
||||
_circuit->position_overlays[0]
|
||||
= Coloquinte::solve_quadratic_model( *_circuit
|
||||
, _circuit->position_overlays[0]
|
||||
, _circuit->position_overlays[1]
|
||||
, strength
|
||||
);
|
||||
timeDelta = time(NULL) - startTime;
|
||||
lowerBound = B2B_wirelength( *_circuit, _circuit->position_overlays[0] );
|
||||
cmess2 << " "
|
||||
<< " Elapsed time:" << setw( 5) << timeDelta << "s"
|
||||
<< " Lower bound:" << setw(10)
|
||||
<< lowerBound << endl;
|
||||
cmess2 << " Spreading ratio: "
|
||||
<< ((((double)upperBound-(double)lowerBound)*100) / (double)lowerBound) << "%" << endl;
|
||||
|
||||
_updatePlacement( 0 );
|
||||
if (i >= 30) {
|
||||
auto legalizer = legalize( _circuit, _placementUB, _surface, sliceHeight );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Legal. " );
|
||||
_updatePlacement( _placementUB );
|
||||
}
|
||||
|
||||
_updatePlacement( 1 );
|
||||
// Get the system to optimize (tolerance, maximum and minimum pin counts)
|
||||
// and the pulling forces (threshold distance)
|
||||
auto solv = get_HPWLF_linear_system ( _circuit, _placementLB, 0.01, 2, 100000 )
|
||||
+ get_linear_pulling_forces( _circuit, _placementUB, _placementLB, pulling_force, 40.0 );
|
||||
get_result( _circuit, _placementLB, solv, 400 ); // number of iterations
|
||||
_progressReport2( startTime, " Linear." );
|
||||
_updatePlacement( _placementLB );
|
||||
|
||||
// Optimize orientation sometimes
|
||||
// if (i>=10 and i%5 == 0) {
|
||||
// optimize_exact_orientations( _circuit, _placementLB );
|
||||
// std::cout << "Oriented" << std::endl;
|
||||
// //output_progressReport(circuit, LB_pl);
|
||||
// _updatePlacement( _placementLB );
|
||||
// }
|
||||
}
|
||||
|
||||
cmess1 << " o Detailed Placement." << endl;
|
||||
index_t legalizeIterations = 10;
|
||||
for ( index_t i=0; i<legalizeIterations; ++i ){
|
||||
ostringstream label;
|
||||
label.str("");
|
||||
label << " [" << setw(2) << setfill('0') << i << "]";
|
||||
|
||||
optimize_exact_orientations( _circuit, _placementUB );
|
||||
_progressReport1( startTime, label.str()+" Oriented ......." );
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
auto legalizer = legalize( _circuit, _placementLB, _surface, sliceHeight );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Legalized ......" );
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
swaps_global( _circuit, legalizer, 3, 4 );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Global Swaps ..." );
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
OSRP_convex( _circuit, legalizer );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Row Optimization" );
|
||||
_updatePlacement( _placementUB );
|
||||
|
||||
swaps_row( _circuit, legalizer, 4 );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Local Swaps ...." );
|
||||
|
||||
if (i == legalizeIterations-1) {
|
||||
row_compatible_orientation( _circuit, legalizer, true );
|
||||
coloquinte::dp::get_result( _circuit, legalizer, _placementUB );
|
||||
_progressReport1( startTime, " Final Legalize ." );
|
||||
}
|
||||
|
||||
_updatePlacement( _placementUB, (i==legalizeIterations-1) ? ForceUpdate : 0 );
|
||||
}
|
||||
|
||||
|
||||
cmess1 << " o Adding feed cells." << endl;
|
||||
addFeeds();
|
||||
|
||||
cmess1 << " o Placement finished." << endl;
|
||||
stopMeasures();
|
||||
printMeasures( "total" );
|
||||
cmess1 << ::Dots::asString
|
||||
(" - HPWL", DbU::getValueString(get_HPWL_wirelength(_circuit,_placementUB )*getPitch()) ) << endl;
|
||||
cmess1 << ::Dots::asString
|
||||
(" - RMST", DbU::getValueString(get_RSMT_wirelength(_circuit,_placementUB )*getPitch()) ) << endl;
|
||||
|
||||
_flags &= ~NoPlacement;
|
||||
#else
|
||||
cerr << Warning("Coloquinte library wasn't found, Etesian is disabled.") << endl;
|
||||
|
@ -513,9 +710,56 @@ namespace Etesian {
|
|||
}
|
||||
|
||||
|
||||
void EtesianEngine::_updatePlacement ( unsigned int placementId )
|
||||
void EtesianEngine::_progressReport1 ( time_t startTime, string label ) const
|
||||
{
|
||||
#if HAVE_COLOQUINTE
|
||||
size_t w = label.size();
|
||||
string indent ( w, ' ' );
|
||||
if (not w) {
|
||||
label = string( 5, ' ' );
|
||||
indent = label;
|
||||
}
|
||||
|
||||
ostringstream elapsed;
|
||||
elapsed << " dTime:" << setw(5) << (time(NULL) - startTime) << "s ";
|
||||
|
||||
cmess2 << label << elapsed.str()
|
||||
<< " HPWL:" << get_HPWL_wirelength ( _circuit, _placementUB )
|
||||
<< " RMST:" << get_RSMT_wirelength ( _circuit, _placementUB )
|
||||
<< "\n" << indent
|
||||
<< " Linear Disrupt.:" << get_mean_linear_disruption ( _circuit, _placementLB, _placementUB )
|
||||
<< " Quad Disrupt.:" << get_mean_quadratic_disruption( _circuit, _placementLB, _placementUB )
|
||||
<< endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void EtesianEngine::_progressReport2 ( time_t startTime, string label ) const
|
||||
{
|
||||
#if HAVE_COLOQUINTE
|
||||
size_t w = label.size();
|
||||
string indent ( w, ' ' );
|
||||
if (not w) {
|
||||
label = string( 5, ' ' );
|
||||
indent = label;
|
||||
}
|
||||
|
||||
ostringstream elapsed;
|
||||
elapsed << " dTime:" << setw(5) << (time(NULL) - startTime) << "s ";
|
||||
|
||||
cmess2 << label << elapsed.str()
|
||||
<< " HPWL:" << get_HPWL_wirelength( _circuit, _placementLB )
|
||||
<< " RMST:" << get_RSMT_wirelength( _circuit, _placementLB )
|
||||
<< endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void EtesianEngine::_updatePlacement ( const coloquinte::gp::placement_t& placement, unsigned int flags )
|
||||
{
|
||||
#if HAVE_COLOQUINTE
|
||||
if ((not isSlowMotion()) and not (flags & ForceUpdate)) return;
|
||||
|
||||
UpdateSession::open();
|
||||
|
||||
forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() )
|
||||
|
@ -532,14 +776,26 @@ namespace Etesian {
|
|||
if (iid == _cellsToIds.end() ) {
|
||||
cerr << Error( "Unable to lookup instance <%s>.", instanceName.c_str() ) << endl;
|
||||
} else {
|
||||
instancePosition.setX( _circuit->position_overlays[placementId].x_pos[(*iid).second] * DbU::fromLambda(5.0) );
|
||||
instancePosition.setY( _circuit->position_overlays[placementId].y_pos[(*iid).second] * DbU::fromLambda(5.0) );
|
||||
point<float_t> position = placement.positions_[(*iid).second];
|
||||
|
||||
if ( isNan(position.x_) or isNan(position.y_) ) {
|
||||
cerr << Error( "Instance <%s> is not placed yet (position == NaN)."
|
||||
, instanceName.c_str() ) << endl;
|
||||
instance->setPlacementStatus( Instance::PlacementStatus::UNPLACED );
|
||||
continue;
|
||||
}
|
||||
|
||||
Transformation trans = toTransformation( position
|
||||
, placement.orientations_[(*iid).second]
|
||||
, instance->getMasterCell()
|
||||
, getPitch()
|
||||
);
|
||||
|
||||
//cerr << "Setting <" << instanceName << " @" << instancePosition << endl;
|
||||
|
||||
// This is temporary as it's not trans-hierarchic: we ignore the posutions
|
||||
// of all the intermediary instances.
|
||||
instance->setTransformation( instancePosition );
|
||||
instance->setTransformation( trans );
|
||||
instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
||||
}
|
||||
}
|
||||
|
@ -568,7 +824,6 @@ namespace Etesian {
|
|||
Record* record = ToolEngine::_getRecord ();
|
||||
|
||||
if (record) {
|
||||
//record->add( getSlot( "_routingPlanes", &_routingPlanes ) );
|
||||
record->add( getSlot( "_configuration", _configuration ) );
|
||||
}
|
||||
return record;
|
||||
|
|
|
@ -0,0 +1,94 @@
|
|||
// -*- C++ -*-
|
||||
//
|
||||
// This file is part of the Coriolis Software.
|
||||
// Copyright (c) UPMC 2015-2015, All Rights Reserved
|
||||
//
|
||||
// +-----------------------------------------------------------------+
|
||||
// | C O R I O L I S |
|
||||
// | E t e s i a n - A n a l y t i c P l a c e r |
|
||||
// | |
|
||||
// | Author : Jean-Paul CHAPUT |
|
||||
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||
// | =============================================================== |
|
||||
// | C++ Module : "./FeedCells.cpp" |
|
||||
// +-----------------------------------------------------------------+
|
||||
|
||||
|
||||
#include <sstream>
|
||||
#include "hurricane/Warning.h"
|
||||
#include "etesian/FeedCells.h"
|
||||
#include "etesian/EtesianEngine.h"
|
||||
|
||||
|
||||
namespace Etesian {
|
||||
|
||||
using std::cerr;
|
||||
using std::endl;
|
||||
using std::map;
|
||||
using std::string;
|
||||
using std::ostringstream;
|
||||
using std::make_pair;
|
||||
using Hurricane::Warning;
|
||||
using Hurricane::DbU;
|
||||
|
||||
|
||||
void FeedCells::useFeed ( Cell* cell )
|
||||
{
|
||||
if ( cell == NULL ) return;
|
||||
|
||||
DbU::Unit pitch = _etesian->getPitch();
|
||||
|
||||
if (cell->getAbutmentBox().getWidth() % pitch != 0)
|
||||
cerr << Warning( "FeedCells::addFeed(): <%s> has not a width (%s) multiple of pitch (%s)."
|
||||
, getString(cell->getName()).c_str()
|
||||
, DbU::getValueString(cell->getAbutmentBox().getWidth()).c_str()
|
||||
, DbU::getValueString(pitch).c_str()
|
||||
) << endl;
|
||||
|
||||
int pitchNb = (int)( cell->getAbutmentBox().getWidth() / pitch );
|
||||
|
||||
if (getFeed(pitchNb) != NULL) {
|
||||
cerr << Warning( "FeedCells::addFeed(): <%s> duplicate feed for width %d."
|
||||
, getString(cell->getName()).c_str()
|
||||
, pitchNb
|
||||
) << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
_feedCells.insert( make_pair(pitchNb,cell) );
|
||||
}
|
||||
|
||||
|
||||
Cell* FeedCells::getBiggestFeed () const
|
||||
{
|
||||
if (_feedCells.empty()) return NULL;
|
||||
return (*(--_feedCells.end())).second;
|
||||
}
|
||||
|
||||
|
||||
Cell* FeedCells::getSmallestFeed () const
|
||||
{
|
||||
if (_feedCells.empty()) return NULL;
|
||||
return (*(_feedCells.begin())).second;
|
||||
}
|
||||
|
||||
|
||||
Cell* FeedCells::getFeed ( int pitches ) const
|
||||
{
|
||||
map<int,Cell*>::const_iterator ifeed = _feedCells.find( pitches );
|
||||
if (ifeed == _feedCells.end()) return NULL;
|
||||
|
||||
return (*ifeed).second;
|
||||
}
|
||||
|
||||
|
||||
string FeedCells::getUniqueInstanceName () const
|
||||
{
|
||||
ostringstream name;
|
||||
name << "feed_" << _feedCount++;
|
||||
|
||||
return name.str();
|
||||
}
|
||||
|
||||
|
||||
} // Etesian namespace.
|
|
@ -99,6 +99,7 @@ namespace Etesian {
|
|||
_viewer->clearToolInterrupt();
|
||||
|
||||
EtesianEngine* etesian = getForFramework( CreateEngine );
|
||||
etesian->getConfiguration()->setFlags( EtesianEngine::SlowMotion );
|
||||
etesian->resetPlacement();
|
||||
etesian->place();
|
||||
}
|
||||
|
|
|
@ -87,11 +87,7 @@ extern "C" {
|
|||
Py_INCREF( &PyTypeGraphicEtesianEngine );
|
||||
PyModule_AddObject( module, "GraphicEtesianEngine", (PyObject*)&PyTypeGraphicEtesianEngine );
|
||||
|
||||
//PyObject* dictionnary = PyModule_GetDict( module );
|
||||
//PyObject* constant;
|
||||
|
||||
//LoadObjectConstant( dictionnary, KtBuildGlobalRouting, "KtBuildGlobalRouting" );
|
||||
//LoadObjectConstant( dictionnary, KtLoadGlobalRouting , "KtLoadGlobalRouting" );
|
||||
PyEtesianEngine_postModuleInit();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -109,7 +109,7 @@ extern "C" {
|
|||
METHOD_HEAD("EtesianEngine.place()")
|
||||
unsigned int flags = 0;
|
||||
if (PyArg_ParseTuple(args,"I:EtesianEngine.place", &flags)) {
|
||||
etesian->place(/*flags*/);
|
||||
etesian->place( flags );
|
||||
} else {
|
||||
PyErr_SetString(ConstructorError, "EtesianEngine.place(): Invalid number/bad type of parameter.");
|
||||
return NULL;
|
||||
|
@ -137,24 +137,8 @@ extern "C" {
|
|||
, "Returns the Etesian engine attached to the Cell, None if there isnt't." }
|
||||
, { "create" , (PyCFunction)PyEtesianEngine_create , METH_VARARGS|METH_STATIC
|
||||
, "Create a Etesian engine on this cell." }
|
||||
// , { "printConfiguration", (PyCFunction)PyEtesianEngine_printConfiguration, METH_NOARGS
|
||||
// , "Display on the console the configuration of Etesian." }
|
||||
// , { "saveGlobalSolution", (PyCFunction)PyEtesianEngine_saveGlobalSolution, METH_NOARGS
|
||||
// , "Save the global routing solution on disk." }
|
||||
// , { "getToolSuccess" , (PyCFunction)PyEtesianEngine_getToolSuccess , METH_NOARGS
|
||||
// , "Returns True if the detailed routing has been successful." }
|
||||
// , { "loadGlobalRouting" , (PyCFunction)PyEtesianEngine_loadGlobalRouting , METH_VARARGS
|
||||
// , "Read/load the global routing and build topologies for Etesian." }
|
||||
, { "place" , (PyCFunction)PyEtesianEngine_place , METH_VARARGS
|
||||
, "Run the global router (Knik)." }
|
||||
// , { "layerAssign" , (PyCFunction)PyEtesianEngine_layerAssign , METH_VARARGS
|
||||
// , "Run the layer assigment stage." }
|
||||
// , { "runNegociate" , (PyCFunction)PyEtesianEngine_runNegociate , METH_NOARGS
|
||||
// , "Run the negociation stage of the detailed router." }
|
||||
// , { "finalizeLayout" , (PyCFunction)PyEtesianEngine_finalizeLayout , METH_NOARGS
|
||||
// , "Revert to a pure Hurricane database, remove router's additionnal data structures." }
|
||||
// , { "dumpMeasures" , (PyCFunction)PyEtesianEngine_dumpMeasures , METH_NOARGS
|
||||
// , "Dump to disk lots of statistical informations about the routing." }
|
||||
, { "destroy" , (PyCFunction)PyEtesianEngine_destroy , METH_NOARGS
|
||||
, "Destroy the associated hurricane object. The python object remains." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
|
@ -178,6 +162,14 @@ extern "C" {
|
|||
DBoLinkCreateMethod(EtesianEngine)
|
||||
|
||||
|
||||
extern void PyEtesianEngine_postModuleInit ()
|
||||
{
|
||||
PyObject* constant;
|
||||
|
||||
LoadObjectConstant(PyTypeEtesianEngine.tp_dict,EtesianEngine::SlowMotion,"SlowMotion");
|
||||
}
|
||||
|
||||
|
||||
#endif // Shared Library Code Part.
|
||||
|
||||
} // extern "C".
|
||||
|
|
|
@ -25,10 +25,7 @@ namespace Hurricane {
|
|||
class Cell;
|
||||
}
|
||||
|
||||
#include "crlcore/RoutingGauge.h"
|
||||
namespace CRL {
|
||||
class RoutingLayerGauge;
|
||||
}
|
||||
#include "crlcore/CellGauge.h"
|
||||
|
||||
|
||||
namespace Etesian {
|
||||
|
@ -39,8 +36,7 @@ namespace Etesian {
|
|||
using Hurricane::Layer;
|
||||
using Hurricane::DbU;
|
||||
using Hurricane::Cell;
|
||||
using CRL::RoutingGauge;
|
||||
using CRL::RoutingLayerGauge;
|
||||
using CRL::CellGauge;
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
|
@ -53,7 +49,10 @@ namespace Etesian {
|
|||
virtual ~Configuration ();
|
||||
virtual Configuration* clone () const = 0;
|
||||
// Methods.
|
||||
virtual RoutingGauge* getRoutingGauge () const = 0;
|
||||
virtual CellGauge* getCellGauge () const = 0;
|
||||
virtual bool isSlowMotion () const = 0;
|
||||
virtual void setFlags ( unsigned int ) = 0;
|
||||
virtual void unsetFlags ( unsigned int ) = 0;
|
||||
virtual void print ( Cell* ) const = 0;
|
||||
virtual Record* _getRecord () const = 0;
|
||||
virtual string _getString () const = 0;
|
||||
|
@ -76,18 +75,22 @@ namespace Etesian {
|
|||
friend class Configuration;
|
||||
public:
|
||||
// Constructor & Destructor.
|
||||
ConfigurationConcrete ( const RoutingGauge* rg=NULL );
|
||||
ConfigurationConcrete ( const CellGauge* cg=NULL );
|
||||
virtual ~ConfigurationConcrete ();
|
||||
virtual ConfigurationConcrete* clone () const;
|
||||
// Methods.
|
||||
virtual RoutingGauge* getRoutingGauge () const;
|
||||
virtual CellGauge* getCellGauge () const;
|
||||
virtual bool isSlowMotion () const;
|
||||
virtual void setFlags ( unsigned int );
|
||||
virtual void unsetFlags ( unsigned int );
|
||||
virtual void print ( Cell* ) const;
|
||||
virtual Record* _getRecord () const;
|
||||
virtual string _getString () const;
|
||||
virtual string _getTypeName () const;
|
||||
protected:
|
||||
// Attributes.
|
||||
RoutingGauge* _rg;
|
||||
CellGauge* _cg;
|
||||
unsigned int _flags;
|
||||
private:
|
||||
ConfigurationConcrete ( const ConfigurationConcrete& );
|
||||
ConfigurationConcrete& operator= ( const ConfigurationConcrete& );
|
||||
|
|
|
@ -19,31 +19,32 @@
|
|||
|
||||
#include <iostream>
|
||||
#include <unordered_map>
|
||||
#include "Coloquinte/circuit.hxx"
|
||||
|
||||
//#include "coloquinte/circuit_graph.hxx"
|
||||
namespace Coloquinte {
|
||||
struct circuit;
|
||||
}
|
||||
|
||||
#include "hurricane/Timer.h"
|
||||
#include "hurricane/Name.h"
|
||||
namespace Hurricane {
|
||||
class Layer;
|
||||
class Net;
|
||||
class Cell;
|
||||
class CellWidget;
|
||||
class Instance;
|
||||
}
|
||||
|
||||
#include "crlcore/ToolEngine.h"
|
||||
#include "etesian/Configuration.h"
|
||||
#include "etesian/FeedCells.h"
|
||||
|
||||
|
||||
namespace Etesian {
|
||||
|
||||
using Hurricane::Timer;
|
||||
using Hurricane::Name;
|
||||
using Hurricane::Layer;
|
||||
using Hurricane::Net;
|
||||
using Hurricane::Cell;
|
||||
using Hurricane::Record;
|
||||
using Hurricane::Instance;
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
|
@ -51,18 +52,33 @@ namespace Etesian {
|
|||
|
||||
class EtesianEngine : public CRL::ToolEngine {
|
||||
public:
|
||||
enum Flag { NoPlacement=0x0001, FlatDesign=0x0002 };
|
||||
enum Flag { NoPlacement=0x0001
|
||||
, FlatDesign =0x0002
|
||||
, ForceUpdate=0x0004
|
||||
, SlowMotion =0x0008
|
||||
};
|
||||
public:
|
||||
static const Name& staticGetName ();
|
||||
static EtesianEngine* create ( Cell* );
|
||||
static EtesianEngine* get ( const Cell* );
|
||||
public:
|
||||
inline bool isSlowMotion () const;
|
||||
virtual Configuration* getConfiguration ();
|
||||
virtual const Configuration* getConfiguration () const;
|
||||
virtual const Name& getName () const;
|
||||
inline CellGauge* getCellGauge () const;
|
||||
inline DbU::Unit getPitch () const;
|
||||
inline DbU::Unit getSliceHeight () const;
|
||||
inline const FeedCells& getFeedCells () const;
|
||||
inline void setCellWidget ( Hurricane::CellWidget* );
|
||||
void startMeasures ();
|
||||
void stopMeasures ();
|
||||
void printMeasures ( std::string ) const;
|
||||
void resetPlacement ();
|
||||
void place ( unsigned int slowMotion=0 );
|
||||
void _updatePlacement ( unsigned int placementId );
|
||||
void toColoquinte ();
|
||||
void place ( unsigned int flags=SlowMotion );
|
||||
inline void useFeed ( Cell* );
|
||||
void addFeeds ();
|
||||
virtual Record* _getRecord () const;
|
||||
virtual std::string _getString () const;
|
||||
virtual std::string _getTypeName () const;
|
||||
|
@ -73,9 +89,15 @@ namespace Etesian {
|
|||
protected:
|
||||
Configuration* _configuration;
|
||||
unsigned int _flags;
|
||||
Coloquinte::circuit* _circuit;
|
||||
Timer _timer;
|
||||
coloquinte::box<coloquinte::int_t> _surface;
|
||||
coloquinte::netlist _circuit;
|
||||
coloquinte::gp::placement_t _placementLB;
|
||||
coloquinte::gp::placement_t _placementUB;
|
||||
std::unordered_map<string,unsigned int> _cellsToIds;
|
||||
std::vector<Instance*> _idsToInsts;
|
||||
Hurricane::CellWidget* _cellWidget;
|
||||
FeedCells _feedCells;
|
||||
|
||||
protected:
|
||||
// Constructors & Destructors.
|
||||
|
@ -86,11 +108,21 @@ namespace Etesian {
|
|||
private:
|
||||
EtesianEngine ( const EtesianEngine& );
|
||||
EtesianEngine& operator= ( const EtesianEngine& );
|
||||
private:
|
||||
void _updatePlacement ( const coloquinte::gp::placement_t&, unsigned int flags=0 );
|
||||
void _progressReport1 ( time_t startTime, string label ) const;
|
||||
void _progressReport2 ( time_t startTime, string label ) const;
|
||||
};
|
||||
|
||||
|
||||
// Inline Functions.
|
||||
inline bool EtesianEngine::isSlowMotion () const { return getConfiguration()->isSlowMotion(); }
|
||||
inline void EtesianEngine::setCellWidget ( Hurricane::CellWidget* cw ) { _cellWidget = cw; }
|
||||
inline CellGauge* EtesianEngine::getCellGauge () const { return getConfiguration()->getCellGauge(); }
|
||||
inline DbU::Unit EtesianEngine::getPitch () const { return getCellGauge()->getPitch(); }
|
||||
inline DbU::Unit EtesianEngine::getSliceHeight () const { return getCellGauge()->getSliceHeight(); }
|
||||
inline void EtesianEngine::useFeed ( Cell* cell ) { _feedCells.useFeed(cell); }
|
||||
inline const FeedCells& EtesianEngine::getFeedCells () const { return _feedCells; }
|
||||
|
||||
|
||||
// Variables.
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
// -*- C++ -*-
|
||||
//
|
||||
// This file is part of the Coriolis Software.
|
||||
// Copyright (c) UPMC 2015-2015, All Rights Reserved
|
||||
//
|
||||
// +-----------------------------------------------------------------+
|
||||
// | C O R I O L I S |
|
||||
// | E t e s i a n - A n a l y t i c P l a c e r |
|
||||
// | |
|
||||
// | Author : Jean-Paul CHAPUT |
|
||||
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||
// | =============================================================== |
|
||||
// | C++ Header : "./FeedCells.h" |
|
||||
// +-----------------------------------------------------------------+
|
||||
|
||||
|
||||
#ifndef ETESIAN_FEEDCELLS_H
|
||||
#define ETESIAN_FEEDCELLS_H
|
||||
|
||||
#include <map>
|
||||
#include "hurricane/Cell.h"
|
||||
|
||||
|
||||
namespace Etesian {
|
||||
|
||||
using Hurricane::Cell;
|
||||
class EtesianEngine;
|
||||
|
||||
|
||||
class FeedCells {
|
||||
public:
|
||||
inline FeedCells ( EtesianEngine* );
|
||||
void useFeed ( Cell* );
|
||||
Cell* getBiggestFeed () const;
|
||||
Cell* getSmallestFeed () const;
|
||||
Cell* getFeed ( int pitches ) const;
|
||||
std::string getUniqueInstanceName () const;
|
||||
private:
|
||||
EtesianEngine* _etesian;
|
||||
std::map<int,Cell*> _feedCells;
|
||||
mutable unsigned int _feedCount;
|
||||
};
|
||||
|
||||
|
||||
// Inline Methods.
|
||||
inline FeedCells::FeedCells ( EtesianEngine* etesian )
|
||||
: _etesian (etesian)
|
||||
, _feedCells()
|
||||
, _feedCount(0)
|
||||
{ }
|
||||
|
||||
|
||||
} // Etesian namespace.
|
||||
|
||||
#endif // ETESIAN_FEEDCELLS_H
|
|
@ -44,6 +44,7 @@ extern "C" {
|
|||
|
||||
extern PyObject* PyEtesianEngine_Link ( Etesian::EtesianEngine* );
|
||||
extern void PyEtesianEngine_LinkPyType ();
|
||||
extern void PyEtesianEngine_postModuleInit ();
|
||||
|
||||
|
||||
#define IsPyEtesianEngine(v) ( (v)->ob_type == &PyTypeEtesianEngine )
|
||||
|
|
|
@ -104,7 +104,8 @@ Cell::Cell(Library* library, const Name& name)
|
|||
_nextOfLibraryCellMap(NULL),
|
||||
_nextOfSymbolCellSet(NULL),
|
||||
_slaveEntityMap(),
|
||||
_observers()
|
||||
_observers(),
|
||||
_flags(0)
|
||||
{
|
||||
if (!_library)
|
||||
throw Error("Can't create " + _TName("Cell") + " : null library");
|
||||
|
@ -193,6 +194,8 @@ void Cell::flattenNets(unsigned int flags)
|
|||
{
|
||||
UpdateSession::open();
|
||||
|
||||
_flags |= FlattenedNets;
|
||||
|
||||
forEach ( Occurrence, ioccurrence, getHyperNetRootNetOccurrences() ) {
|
||||
Net* net = static_cast<Net*>((*ioccurrence).getEntity());
|
||||
|
||||
|
|
|
@ -72,6 +72,8 @@ class Cell : public Entity {
|
|||
// Flags set for Observers.
|
||||
, CellAboutToChange = 0x0001
|
||||
, CellChanged = 0x0002
|
||||
// Cell states
|
||||
, FlattenedNets = 0x0001
|
||||
};
|
||||
public: typedef Entity Inherit;
|
||||
public: typedef map<Name,ExtensionSlice*> ExtensionSliceMap;
|
||||
|
@ -180,6 +182,7 @@ class Cell : public Entity {
|
|||
private: Cell* _nextOfSymbolCellSet;
|
||||
private: SlaveEntityMap _slaveEntityMap;
|
||||
private: Observable _observers;
|
||||
private: unsigned int _flags;
|
||||
|
||||
// Constructors
|
||||
// ************
|
||||
|
@ -303,6 +306,7 @@ class Cell : public Entity {
|
|||
public: bool isFlattenLeaf() const {return _isFlattenLeaf;};
|
||||
public: bool isLeaf() const;
|
||||
public: bool isPad() const {return _isPad;};
|
||||
public: bool isFlattenedNets() const {return _flags & FlattenedNets;};
|
||||
|
||||
// Updators
|
||||
// ********
|
||||
|
|
|
@ -40,11 +40,13 @@ namespace Hurricane {
|
|||
public:
|
||||
enum State { Excluded = 0x0001
|
||||
, Fixed = 0x0002
|
||||
, ManualGlobalRoute = 0x0004
|
||||
, AutomaticGlobalRoute = 0x0008
|
||||
, Unconnected = 0x0004
|
||||
, ManualGlobalRoute = 0x0008
|
||||
, AutomaticGlobalRoute = 0x0010
|
||||
, MixedPreRoute = Fixed|ManualGlobalRoute
|
||||
};
|
||||
public:
|
||||
inline bool isUnconnected () const;
|
||||
inline bool isFixed () const;
|
||||
inline bool isManualGlobalRoute () const;
|
||||
inline bool isAutomaticGlobalRoute () const;
|
||||
|
@ -67,6 +69,7 @@ namespace Hurricane {
|
|||
|
||||
inline NetRoutingState::NetRoutingState ( Net* net, unsigned int flags ) : _net(net), _flags(flags) { }
|
||||
|
||||
inline bool NetRoutingState::isUnconnected () const { return _flags & Unconnected; };
|
||||
inline bool NetRoutingState::isFixed () const { return _flags & Fixed; };
|
||||
inline bool NetRoutingState::isManualGlobalRoute () const { return _flags & ManualGlobalRoute; };
|
||||
inline bool NetRoutingState::isAutomaticGlobalRoute () const { return _flags & AutomaticGlobalRoute; };
|
||||
|
@ -113,6 +116,7 @@ namespace Hurricane {
|
|||
|
||||
class NetRoutingExtension {
|
||||
public:
|
||||
static inline bool isUnconnected ( const Net* );
|
||||
static inline bool isFixed ( const Net* );
|
||||
static inline bool isManualGlobalRoute ( const Net* );
|
||||
static inline bool isAutomaticGlobalRoute ( const Net* );
|
||||
|
@ -128,6 +132,13 @@ namespace Hurricane {
|
|||
};
|
||||
|
||||
|
||||
inline bool NetRoutingExtension::isUnconnected ( const Net* net )
|
||||
{
|
||||
NetRoutingState* state = get( net );
|
||||
return (state == NULL) ? false : state->isUnconnected();
|
||||
}
|
||||
|
||||
|
||||
inline bool NetRoutingExtension::isFixed ( const Net* net )
|
||||
{
|
||||
NetRoutingState* state = get( net );
|
||||
|
|
|
@ -502,6 +502,14 @@ namespace Hurricane {
|
|||
, QIcon(":/images/python-logo-v3.png")
|
||||
);
|
||||
connect( action, SIGNAL(triggered()), this, SLOT(runScriptWidget()) );
|
||||
|
||||
action = addToMenu( "tools.stressScript"
|
||||
, tr("Python Stress Script")
|
||||
, tr("Run Python Stress Script (50 times...).")
|
||||
, QKeySequence()
|
||||
, QIcon(":/images/python-logo-v3.png")
|
||||
);
|
||||
connect( action, SIGNAL(triggered()), this, SLOT(runStressScript()) );
|
||||
}
|
||||
|
||||
|
||||
|
@ -783,6 +791,15 @@ namespace Hurricane {
|
|||
{ ExceptionWidget::catchAllWrapper( std::bind( &CellViewer::_runScript, this, scriptPath ) ); }
|
||||
|
||||
|
||||
void CellViewer::runStressScript ()
|
||||
{
|
||||
for ( size_t i=0 ; i<1000 ; ++i ) {
|
||||
cerr << "Calling ./stressScript [" << setw(3) << right << setfill('0') << i << "]" << endl;
|
||||
ExceptionWidget::catchAllWrapper( std::bind( &CellViewer::_runScript, this, "stressScript.py" ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CellViewer::runScriptWidget ()
|
||||
{ ScriptWidget::runScript( this, getCell() ); }
|
||||
|
||||
|
|
|
@ -141,6 +141,7 @@ namespace Hurricane {
|
|||
void raiseToolInterrupt ();
|
||||
void clearToolInterrupt ();
|
||||
void runScriptWidget ();
|
||||
void runStressScript ();
|
||||
inline void emitCellAboutToChange ();
|
||||
inline void emitCellChanged ();
|
||||
signals:
|
||||
|
|
|
@ -381,12 +381,14 @@ namespace {
|
|||
}
|
||||
}
|
||||
|
||||
ltrace(300) << " Check againts top clocks ck:" << _ck->getName()
|
||||
<< " cki:" << _cki->getName() << " cko:" << _cko->getName() << endl;
|
||||
ltrace(300) << " Check againts top clocks ck:" << ((_ck) ? _ck->getName() : "NULL")
|
||||
<< " cki:" << ((_cki) ? _cki->getName() : "NULL")
|
||||
<< " cko:" << ((_cko) ? _cko->getName() : "NULL")
|
||||
<< endl;
|
||||
|
||||
if (upNet->getName() == _ck->getName() ) return _ck;
|
||||
if (upNet->getName() == _cki->getName()) return _cki;
|
||||
if (upNet->getName() == _cko->getName()) return _cko;
|
||||
if ( _ck and (upNet->getName() == _ck->getName() ) ) return _ck;
|
||||
if ( _cki and (upNet->getName() == _cki->getName()) ) return _cki;
|
||||
if ( _cko and (upNet->getName() == _cko->getName()) ) return _cko;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -164,9 +164,12 @@ namespace Kite {
|
|||
}
|
||||
|
||||
if (isFixed or isPreRouted or (rpCount < 2)) {
|
||||
|
||||
NetRoutingState* state = getRoutingState( *inet, Katabatic::KbCreate );
|
||||
state->unsetFlags( NetRoutingState::AutomaticGlobalRoute );
|
||||
state->setFlags ( NetRoutingState::ManualGlobalRoute );
|
||||
if (rpCount < 2)
|
||||
state->setFlags ( NetRoutingState::Unconnected );
|
||||
|
||||
if (isFixed) {
|
||||
cmess2 << " - <" << (*inet)->getName() << "> is fixed." << endl;
|
||||
|
|
|
@ -278,7 +278,7 @@ namespace Kite {
|
|||
if (not _knik) {
|
||||
unsigned int flags = Cell::WarnOnUnplacedInstances;
|
||||
flags |= (mode & KtBuildGlobalRouting) ? Cell::BuildRings : 0;
|
||||
cell->flattenNets( flags );
|
||||
if (not cell->isFlattenedNets()) cell->flattenNets( flags );
|
||||
|
||||
// Test signals from <snx2013>.
|
||||
//DebugSession::addToTrace( getCell(), "core.snx_inst.a2_x2_8_sig" );
|
||||
|
|
|
@ -228,6 +228,9 @@ void KnikEngine::initGlobalRouting( const map<Name,Net*>& excludedNets )
|
|||
|
||||
forEach ( Net*, inet, getCell()->getNets() ) {
|
||||
if (excludedNets.find(inet->getName()) != excludedNets.end()) {
|
||||
if (NetRoutingExtension::isUnconnected(*inet))
|
||||
cparanoid << " - <" << inet->getName() << "> not routed (unconnected)." << endl;
|
||||
else
|
||||
cparanoid << " - <" << inet->getName() << "> not routed (pre-routing found)." << endl;
|
||||
continue;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue