From 20d25b2053ec6382f6a8cf8cd8a41809a3c21e7d Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Wed, 2 Jul 2014 14:36:58 +0200 Subject: [PATCH] Add NetRoutingState (Property) on Nets to tell Kite what to do. * New: In Katabatic, add the ability to decorate some (i.e. few) nets with a state that indicate to Katabatic & Kite what to do with it. The possible states are: 1. Fixed : all the wire are in fixed positions. The router cannot move them and account them as obstacles. 2. ManualGlobalRoute : a user-defined topology is supplied. The wires still have to be detailed route in "Detailed Pre-Route" but will be skipped for the global routing and fixed for the general Detailed route. 3. AutomaticGlobalRoute : ordinary nets, to be global routed then detail routed. 4. Excluded : do not try to global or detail route thoses nets. 5. MixedPreRoute : mask combining Fixed and ManualGlobalRoute. Not all nets have this property, only those that needs a special processing. To ease the access to the state, it is nested inside a PrivateProperty in the net (NetRoutingProperty), with an extension access class (NetRoutingExtension). * New: In Kite, take account of NetRoutingState. Pointers to the net's states are strored inside an internal map for faster access. The property is *not* deleted when Kite is destroyed. The property will remains until the Net itself is destroyed. As a consequence, the lists that where passed to high level function are removed as the information can now be accessed directly through the net NetRoutingProperty. * New: In Unicorn, in CgtMain, comply with the update interface. * New: In documentation, update the User's Guide to explain the Pre-routed step of Kite. --- crlcore/src/ccore/Catalog.cpp | 22 +- crlcore/src/ccore/crlcore/Catalog.h | 20 +- documentation/UsersGuide/HTML_defs.rst | 1 + documentation/UsersGuide/LaTeX_defs.rst | 1 + documentation/UsersGuide/UsersGuide.rst | 27 ++- documentation/UsersGuide/WWW_defs.rst | 1 + .../images/Coriolis-Soft-Schema.fig | 132 +++++------- .../images/Coriolis-Soft-Schema.pdf | Bin 8577 -> 7798 bytes .../images/Coriolis-Soft-Schema.png | Bin 11847 -> 11593 bytes .../UsersGuide/images/PR-DetailedPreRoute.eps | 164 ++++++++++++++ .../UsersGuide/images/PR-DetailedPreRoute.fig | 20 ++ .../UsersGuide/images/PR-DetailedPreRoute.pdf | Bin 0 -> 5119 bytes .../UsersGuide/images/PR-DetailedPreRoute.png | Bin 0 -> 1157 bytes hurricane/src/viewer/CellViewer.cpp | 3 - hurricane/src/viewer/Script.cpp | 3 +- katabatic/src/CMakeLists.txt | 2 + katabatic/src/KatabaticEngine.cpp | 92 ++++---- katabatic/src/LayerAssign.cpp | 17 +- katabatic/src/LoadGrByNet.cpp | 18 +- katabatic/src/NetRoutingProperty.cpp | 138 ++++++++++++ katabatic/src/katabatic/Constants.h | 1 + katabatic/src/katabatic/KatabaticEngine.h | 204 +++++++++--------- katabatic/src/katabatic/NetRoutingProperty.h | 195 +++++++++++++++++ kite/src/BuildPowerRails.cpp | 10 +- kite/src/BuildPreRouteds.cpp | 29 ++- kite/src/GraphicKiteEngine.cpp | 4 +- kite/src/KiteEngine.cpp | 32 +-- kite/src/KiteMain.cpp | 3 +- kite/src/PyKiteEngine.cpp | 4 +- kite/src/kite/KiteEngine.h | 145 ++++++------- unicorn/src/CgtMain.cpp | 3 +- 31 files changed, 912 insertions(+), 379 deletions(-) create mode 100644 documentation/UsersGuide/images/PR-DetailedPreRoute.eps create mode 100644 documentation/UsersGuide/images/PR-DetailedPreRoute.fig create mode 100644 documentation/UsersGuide/images/PR-DetailedPreRoute.pdf create mode 100644 documentation/UsersGuide/images/PR-DetailedPreRoute.png create mode 100644 katabatic/src/NetRoutingProperty.cpp create mode 100644 katabatic/src/katabatic/NetRoutingProperty.h diff --git a/crlcore/src/ccore/Catalog.cpp b/crlcore/src/ccore/Catalog.cpp index b25e1ca1..1bca9309 100644 --- a/crlcore/src/ccore/Catalog.cpp +++ b/crlcore/src/ccore/Catalog.cpp @@ -1,15 +1,9 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2014, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | Alliance / Hurricane Interface | // | | @@ -17,19 +11,15 @@ // | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | =============================================================== | // | C++ Module : "./Catalog.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ # include using namespace std; -#include "hurricane/Collection.h" -#include "hurricane/Library.h" -#include "hurricane/Name.h" - +#include "hurricane/Collection.h" +#include "hurricane/Library.h" +#include "hurricane/Name.h" #include "crlcore/Utilities.h" #include "crlcore/Catalog.h" diff --git a/crlcore/src/ccore/crlcore/Catalog.h b/crlcore/src/ccore/crlcore/Catalog.h index ec0a47b0..1097b1da 100644 --- a/crlcore/src/ccore/crlcore/Catalog.h +++ b/crlcore/src/ccore/crlcore/Catalog.h @@ -1,8 +1,7 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC 2008-2014, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | @@ -15,15 +14,14 @@ // +-----------------------------------------------------------------+ -#ifndef __CRL_CATALOG_H__ -#define __CRL_CATALOG_H__ +#ifndef CRL_CATALOG_H +#define CRL_CATALOG_H -#include -#include - -#include "hurricane/Name.h" -#include "hurricane/Property.h" -#include "hurricane/Slot.h" +#include +#include +#include "hurricane/Name.h" +#include "hurricane/Property.h" +#include "hurricane/Slot.h" namespace Hurricane { class Cell; @@ -406,4 +404,4 @@ INSPECTOR_P_SUPPORT(CRL::Catalog); INSPECTOR_P_SUPPORT(CRL::Catalog::State); -#endif +#endif // CRL_CATALOG_H diff --git a/documentation/UsersGuide/HTML_defs.rst b/documentation/UsersGuide/HTML_defs.rst index 20b32315..68620e15 100644 --- a/documentation/UsersGuide/HTML_defs.rst +++ b/documentation/UsersGuide/HTML_defs.rst @@ -37,6 +37,7 @@ .. |menu_KiteLoadGlobalRouting| image:: ./images/PR-SBS-LoadGlobal.png .. |menu_KiteGlobalRoute| image:: ./images/PR-GlobalRoute.png .. |menu_KiteDetailedRoute| image:: ./images/PR-DetailedRoute.png +.. |menu_KiteDetailedPreRoute| image:: ./images/PR-DetailedPreRoute.png .. |menu_KiteFinalizeRoute| image:: ./images/PR-FinalizeRoute.png .. Stand-alone images. diff --git a/documentation/UsersGuide/LaTeX_defs.rst b/documentation/UsersGuide/LaTeX_defs.rst index dc7e000c..c424b96c 100644 --- a/documentation/UsersGuide/LaTeX_defs.rst +++ b/documentation/UsersGuide/LaTeX_defs.rst @@ -38,6 +38,7 @@ .. |menu_KiteLoadGlobalRouting| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{L}oad Global Routing}}}}` .. |menu_KiteGlobalRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{G}lobal Route}}}}` .. |menu_KiteDetailedRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{D}etailed Route}}}}` +.. |menu_KiteDetailedPreRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{D}etailed Pre-Route}}}}` .. |menu_KiteFinalizeRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{F}inalize Route}}}}` .. Stand-alone images. diff --git a/documentation/UsersGuide/UsersGuide.rst b/documentation/UsersGuide/UsersGuide.rst index 9045d86e..ccd1f048 100644 --- a/documentation/UsersGuide/UsersGuide.rst +++ b/documentation/UsersGuide/UsersGuide.rst @@ -886,18 +886,25 @@ which represent one track. The maximum capacity of the |SxLib| gauge is |newpage| -Routing a design is done in three ordered steps: +Routing a design is done in four ordered steps: -#. Global routing |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteGlobalRoute|. -#. Detailed routing |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteDetailedRoute|. -#. Finalize routing |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteFinalizeRoute|. +#. Detailed pre-route |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteDetailedPreRoute|. +#. Global routing |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteGlobalRoute|. +#. Detailed routing |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteDetailedRoute|. +#. Finalize routing |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteFinalizeRoute|. -After the detailed routing step the |Kite| data-structure is still active. -The wiring is thus represented in a way that allows |Kite| to manage it but -which is not completly finished. The finalize step performs the removal of -the |Kite| data-structure and finish/cleanup the wiring so that its -connex in the sense of |Hurricane|. *Do not* try to save -your design before that step, you would get gaps in it. +It is possible to supply to the router a complete wiring for some nets that the user's +wants to be routed according to a specific topology. The supplied topology must respect +the building rules of the |Katabatic| database (contacts must be, terminals, turns, h-tee +& v-tee only). During the first step :fboxtt:`Detailed Pre-Route` the router will solve +overlaps between the segments, without making any dogleg. If no pre-routed topologies +are present, this step may be ommited. Any net routed at this step is then fixed and +become unmovable for the later stages. + +After the detailed routing step the |Kite| data-structure is still active +(the Hurricane wiring is decorated). The finalize step performs the removal of +the |Kite| data-structure, and it is not advisable to save the design before +that step. You may visualize the density (saturation) of either |Knik| (on edges) or |Kite| (on GCells) until the routing is finalized. Special layers appears diff --git a/documentation/UsersGuide/WWW_defs.rst b/documentation/UsersGuide/WWW_defs.rst index ac901a71..5062f371 100644 --- a/documentation/UsersGuide/WWW_defs.rst +++ b/documentation/UsersGuide/WWW_defs.rst @@ -42,6 +42,7 @@ .. |menu_KiteLoadGlobalRouting| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-sbs-loadglobal.png .. |menu_KiteGlobalRoute| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-globalroute.png .. |menu_KiteDetailedRoute| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-detailedroute.png +.. |menu_KiteDetailedPreRoute| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-detailedpreroute.png .. |menu_KiteFinalizeRoute| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-finalizeroute.png .. Stand-alone images. diff --git a/documentation/UsersGuide/images/Coriolis-Soft-Schema.fig b/documentation/UsersGuide/images/Coriolis-Soft-Schema.fig index c145d8a1..b7753022 100644 --- a/documentation/UsersGuide/images/Coriolis-Soft-Schema.fig +++ b/documentation/UsersGuide/images/Coriolis-Soft-Schema.fig @@ -3,63 +3,13 @@ Landscape Center Inches Letter -100.00 +70.00 Single -2 1200 2 -6 4125 7725 10875 8775 -2 2 0 2 0 7 60 -1 20 0.000 0 0 -1 0 0 5 - 4200 7800 9000 7800 9000 8700 4200 8700 4200 7800 -2 2 0 2 0 7 60 -1 0 0.000 0 0 -1 0 0 5 - 9000 7800 10800 7800 10800 8700 9000 8700 9000 7800 -4 1 0 50 -1 2 24 0.0000 4 270 1815 6600 8400 Hurricane\001 -4 1 7 50 -1 2 18 0.0000 4 210 840 9900 8400 Isobar\001 --6 -6 4125 4125 7875 5175 -2 2 0 2 21 7 60 -1 20 0.000 0 0 -1 0 0 5 - 4200 4200 6000 4200 6000 5100 4200 5100 4200 4200 -2 2 0 2 21 21 60 -1 41 0.000 0 0 -1 0 0 5 - 6000 4200 7800 4200 7800 5100 6000 5100 6000 4200 -4 1 7 50 -1 2 18 0.0000 4 270 1245 6900 4800 PyMauka\001 -4 1 21 50 -1 2 24 0.0000 4 270 1260 5100 4800 Mauka\001 --6 -6 4725 2325 8475 3375 -2 2 0 2 21 7 60 -1 20 0.000 0 0 -1 0 0 5 - 4800 2400 6600 2400 6600 3300 4800 3300 4800 2400 -2 2 0 2 21 21 60 -1 41 0.000 0 0 -1 0 0 5 - 6600 2400 8400 2400 8400 3300 6600 3300 6600 2400 -4 1 21 50 -1 2 24 0.0000 4 270 885 5700 3000 Knik\001 -4 1 7 50 -1 2 18 0.0000 4 270 990 7500 3000 PyKnik\001 --6 -6 4725 525 8475 1575 -2 2 0 2 21 7 60 -1 20 0.000 0 0 -1 0 0 5 - 4800 600 6600 600 6600 1500 4800 1500 4800 600 -2 2 0 2 21 21 60 -1 41 0.000 0 0 -1 0 0 5 - 6600 600 8400 600 8400 1500 6600 1500 6600 600 -4 1 21 50 -1 2 24 0.0000 4 270 750 5700 1200 Kite\001 -4 1 7 50 -1 2 18 0.0000 4 270 900 7500 1200 PyKite\001 --6 -6 4125 -1275 10875 -225 -2 2 0 2 21 21 60 -1 41 0.000 0 0 -1 0 0 5 - 9000 -1200 10800 -1200 10800 -300 9000 -300 9000 -1200 -2 2 0 2 21 7 60 -1 20 0.000 0 0 -1 0 0 5 - 4200 -1200 9000 -1200 9000 -300 4200 -300 4200 -1200 -4 1 7 50 -1 2 18 0.0000 4 270 1395 9900 -600 PyUnicorn\001 -4 1 21 50 -1 2 24 0.0000 4 270 1440 6600 -600 Unicorn\001 --6 -6 13125 1725 13875 3675 -2 2 0 2 18 7 60 -1 20 0.000 0 0 -1 0 0 5 - 13200 1800 13800 1800 13800 3600 13200 3600 13200 1800 -4 1 18 50 -1 2 24 1.5708 4 270 1275 13650 2700 Stratus\001 --6 -6 13725 4725 14475 6675 -2 2 0 2 18 7 60 -1 20 0.000 0 0 -1 0 0 5 - 13800 4800 14400 4800 14400 6600 13800 6600 13800 4800 -4 1 18 50 -1 2 24 1.5708 4 360 1155 14250 5700 Plugin\001 --6 -2 2 0 2 8 8 60 -1 41 0.000 0 0 -1 0 0 5 +2 2 0 4 8 8 60 -1 41 0.000 0 0 -1 0 0 5 9000 6000 10800 6000 10800 6900 9000 6900 9000 6000 -2 2 0 2 8 7 60 -1 20 0.000 0 0 -1 0 0 5 +2 2 0 4 8 7 60 -1 20 0.000 0 0 -1 0 0 5 4200 6000 9000 6000 9000 6900 4200 6900 4200 6000 2 1 0 2 21 7 70 -1 -1 0.000 0 0 -1 1 0 2 1 1 2.00 120.00 240.00 @@ -67,32 +17,18 @@ Single 2 1 0 2 21 7 70 -1 -1 0.000 0 0 -1 1 0 2 1 1 2.00 120.00 240.00 5100 600 5100 -300 -2 1 0 2 0 7 70 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 2.00 120.00 240.00 - 4950 7800 4950 3300 -2 1 0 2 0 7 70 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 2.00 120.00 240.00 - 5100 7800 5100 1500 2 1 0 2 8 7 70 -1 -1 0.000 0 0 -1 1 0 2 1 1 2.00 120.00 240.00 5400 6000 5400 5100 2 1 0 2 8 7 70 -1 -1 0.000 0 0 -1 1 0 2 1 1 2.00 120.00 240.00 5550 6000 5550 3300 -2 1 0 2 8 7 70 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 2.00 120.00 240.00 - 5700 6000 5700 1500 -2 1 0 2 8 7 70 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 2.00 120.00 240.00 - 5850 6000 5850 -300 2 1 0 2 0 7 70 -1 -1 0.000 0 0 -1 1 0 2 1 1 2.00 120.00 240.00 4800 7800 4800 5100 2 1 0 2 0 7 70 -1 -1 0.000 0 0 -1 1 0 2 1 1 2.00 120.00 240.00 4650 7800 4650 6900 -2 2 0 2 18 7 60 -1 20 0.000 0 0 -1 0 0 5 - 11700 -1200 12600 -1200 12600 8700 11700 8700 11700 -1200 2 1 0 2 18 5 70 -1 -1 0.000 0 0 -1 1 0 2 1 1 2.00 120.00 240.00 10800 8250 11700 8250 @@ -117,15 +53,65 @@ Single 2 1 0 2 18 5 70 -1 -1 0.000 0 0 -1 1 0 2 1 1 2.00 120.00 240.00 12600 2700 13200 2700 -2 2 0 2 18 18 60 -1 20 0.000 0 0 -1 0 0 5 - 12600 -1200 14400 -1200 14400 600 12600 600 12600 -1200 2 1 0 2 18 5 70 -1 -1 0.000 0 0 -1 1 0 2 1 1 2.00 120.00 240.00 13500 1800 13500 600 2 1 0 2 18 5 70 -1 -1 0.000 0 0 -1 1 0 2 1 1 2.00 120.00 240.00 14100 4800 14100 600 -4 1 8 50 -1 2 24 0.0000 4 270 1845 6600 6600 CRL Core\001 -4 1 7 50 -1 2 18 0.0000 4 270 975 9975 6600 PyCRL\001 -4 1 18 50 -1 2 32 1.5708 4 465 1650 12375 3150 Python\001 -4 1 7 50 -1 2 32 1.5708 4 450 690 13650 -300 cgt\001 +2 2 0 4 21 21 60 -1 41 0.000 0 0 -1 0 0 5 + 9000 -1200 10800 -1200 10800 -300 9000 -300 9000 -1200 +2 2 0 4 21 7 60 -1 20 0.000 0 0 -1 0 0 5 + 4200 -1200 9000 -1200 9000 -300 4200 -300 4200 -1200 +2 2 0 4 21 7 60 -1 20 0.000 0 0 -1 0 0 5 + 4800 600 6600 600 6600 1500 4800 1500 4800 600 +2 2 0 4 21 21 60 -1 41 0.000 0 0 -1 0 0 5 + 6600 600 8400 600 8400 1500 6600 1500 6600 600 +2 2 0 4 21 7 60 -1 20 0.000 0 0 -1 0 0 5 + 4800 2400 6600 2400 6600 3300 4800 3300 4800 2400 +2 2 0 4 21 21 60 -1 41 0.000 0 0 -1 0 0 5 + 6600 2400 8400 2400 8400 3300 6600 3300 6600 2400 +2 2 0 4 21 7 60 -1 20 0.000 0 0 -1 0 0 5 + 4200 4200 6000 4200 6000 5100 4200 5100 4200 4200 +2 2 0 4 21 21 60 -1 41 0.000 0 0 -1 0 0 5 + 6000 4200 7800 4200 7800 5100 6000 5100 6000 4200 +2 2 0 4 0 7 60 -1 20 0.000 0 0 -1 0 0 5 + 4200 7800 9000 7800 9000 8700 4200 8700 4200 7800 +2 2 0 4 0 7 60 -1 0 0.000 0 0 -1 0 0 5 + 9000 7800 10800 7800 10800 8700 9000 8700 9000 7800 +2 2 0 4 18 18 60 -1 20 0.000 0 0 -1 0 0 5 + 11700 -1200 12600 -1200 12600 8700 11700 8700 11700 -1200 +2 2 0 4 18 18 70 -1 30 0.000 0 0 -1 0 0 5 + 13800 4800 14400 4800 14400 6600 13800 6600 13800 4800 +2 1 0 2 0 7 70 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 240.00 + 5100 7800 5100 1500 +2 1 0 2 8 7 70 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 240.00 + 5850 6000 5850 -300 +2 2 0 4 18 18 70 -1 30 0.000 0 0 -1 0 0 5 + 13200 1800 13800 1800 13800 3600 13200 3600 13200 1800 +2 1 0 2 8 7 70 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 240.00 + 5700 6000 5700 1500 +2 1 0 2 0 7 70 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 240.00 + 4950 7800 4950 3300 +2 2 0 4 18 18 70 -1 30 0.000 0 0 -1 0 0 5 + 12600 -1200 14400 -1200 14400 600 12600 600 12600 -1200 +4 1 8 50 -1 18 24 0.0000 4 300 1920 6600 6600 CRL Core\001 +4 1 7 50 -1 18 18 0.0000 4 285 990 9975 6600 PyCRL\001 +4 1 7 50 -1 18 32 1.5708 4 480 810 13650 -300 cgt\001 +4 1 7 50 -1 18 18 0.0000 4 285 1500 9900 -600 PyUnicorn\001 +4 1 21 50 -1 18 24 0.0000 4 300 1575 6600 -600 Unicorn\001 +4 1 21 50 -1 18 24 0.0000 4 300 780 5700 1200 Kite\001 +4 1 7 50 -1 18 18 0.0000 4 285 945 7500 1200 PyKite\001 +4 1 21 50 -1 18 24 0.0000 4 300 900 5700 3000 Knik\001 +4 1 7 50 -1 18 18 0.0000 4 285 1020 7500 3000 PyKnik\001 +4 1 7 50 -1 18 18 0.0000 4 285 1290 6900 4800 PyMauka\001 +4 1 21 50 -1 18 24 0.0000 4 300 1275 5100 4800 Mauka\001 +4 1 7 50 -1 18 32 1.5708 4 510 1830 12375 3600 Python\001 +4 1 7 50 -1 18 24 1.5708 4 300 1410 13650 2700 Stratus\001 +4 1 7 50 -1 18 24 1.5708 4 390 1275 14250 5700 Plugin\001 +4 1 0 50 -1 18 24 0.0000 4 300 1935 6600 8400 Hurricane\001 +4 1 7 50 -1 18 18 0.0000 4 225 900 9900 8400 Isobar\001 diff --git a/documentation/UsersGuide/images/Coriolis-Soft-Schema.pdf b/documentation/UsersGuide/images/Coriolis-Soft-Schema.pdf index e8cc3f3ba21d561b9e7f4a2f996cac5598ab6afb..27fb14d29267be3f07a7ea4ddfac3d5c0bbc7ae5 100644 GIT binary patch delta 4929 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 LQBe(jO~8KuKxA|* delta 5693 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 F{TE4-^3MPO diff --git a/documentation/UsersGuide/images/Coriolis-Soft-Schema.png b/documentation/UsersGuide/images/Coriolis-Soft-Schema.png index dd128ec61f20ff17eb90eccec9f784f421897c9a..40ab26b4d749233fc8ab4974baec90986fb51991 100644 GIT binary patch literal 11593 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 literal 11847 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
    Ao!JT@p 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 Z{3jg#j}XB!>IEYbc8LezbN>hH{ukp+Hq-zB diff --git a/documentation/UsersGuide/images/PR-DetailedPreRoute.eps b/documentation/UsersGuide/images/PR-DetailedPreRoute.eps new file mode 100644 index 00000000..99b35a29 --- /dev/null +++ b/documentation/UsersGuide/images/PR-DetailedPreRoute.eps @@ -0,0 +1,164 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: PR-DetailedPreRoute.fig +%%Creator: fig2dev Version 3.2 Patchlevel 5 +%%CreationDate: Wed Jul 2 13:20:44 2014 +%%For: jpc@lepka (Jean-Paul Chaput) +%%BoundingBox: 0 0 200 20 +%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 20 moveto 0 0 lineto 200 0 lineto 200 20 lineto closepath clip newpath +-161.3 126.7 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Helvetica-Bold /Helvetica-Bold-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +10 setmiterlimit +0 slj 0 slc + 0.06000 0.06000 sc +% +% Fig objects follow +% +% +% here starts figure with depth 50 +% Polyline +0 slj +0 slc +7.500 slw +n 2700 1800 m 3300 1800 l 3300 2100 l 2700 2100 l + cp gs col0 s gr +/Helvetica-Bold-iso ff 183.33 scf sf +3000 2025 m +gs 1 -1 sc (P&R) dup sw pop 2 div neg 0 rm col0 sh gr +% Polyline +15.000 slw +gs clippath +3404 1995 m 3615 1995 l 3615 1905 l 3404 1905 l 3404 1905 l 3584 1950 l 3404 1995 l cp +eoclip +n 3300 1950 m + 3600 1950 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 3404 1995 m 3584 1950 l 3404 1905 l 3404 1995 l cp gs 0.00 setgray ef gr col0 s +% Polyline +n 3600 1800 m 6000 1800 l 6000 2100 l 3600 2100 l + cp gs col0 s gr +/Helvetica-Bold-iso ff 183.33 scf sf +4800 2025 m +gs 1 -1 sc (Kite - Detailed Pre-Route) dup sw pop 2 div neg 0 rm col0 sh gr +% here ends figure; +$F2psEnd +rs +showpage +%%Trailer +%EOF diff --git a/documentation/UsersGuide/images/PR-DetailedPreRoute.fig b/documentation/UsersGuide/images/PR-DetailedPreRoute.fig new file mode 100644 index 00000000..285b6a49 --- /dev/null +++ b/documentation/UsersGuide/images/PR-DetailedPreRoute.fig @@ -0,0 +1,20 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +6 2700 1800 3300 2100 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2700 1800 3300 1800 3300 2100 2700 2100 2700 1800 +4 1 0 50 -1 18 11 0.0000 4 135 390 3000 2025 P&R\001 +-6 +2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 90.00 180.00 + 3300 1950 3600 1950 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3600 1800 6000 1800 6000 2100 3600 2100 3600 1800 +4 1 0 50 -1 18 11 0.0000 4 135 2115 4800 2025 Kite - Detailed Pre-Route\001 diff --git a/documentation/UsersGuide/images/PR-DetailedPreRoute.pdf b/documentation/UsersGuide/images/PR-DetailedPreRoute.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fc1d4a5eeb8c9f6ef5c8d79e1ecb96589f3b8875 GIT binary patch literal 5119 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 O>|@qkakKd~vTp#7$@a1U literal 0 HcmV?d00001 diff --git a/hurricane/src/viewer/CellViewer.cpp b/hurricane/src/viewer/CellViewer.cpp index b6652adb..a9d26630 100644 --- a/hurricane/src/viewer/CellViewer.cpp +++ b/hurricane/src/viewer/CellViewer.cpp @@ -328,11 +328,8 @@ namespace Hurricane { const boost::any& callback = iaction->second; if (callback.type() == typeid( std::function )) { - cerr << "Called function " << qPrintable(path) << endl; ExceptionWidget::catchAllWrapper( boost::any_cast< std::function >(callback) ); } else if (callback.type() == typeid( QString )) { - cerr << "Called script " << qPrintable(path) << ":" - << qPrintable(boost::any_cast(callback)) << endl; runScript( boost::any_cast(callback) ); } else { cerr << Error("CellViewer::doAction(): For action \"%s\",\n" diff --git a/hurricane/src/viewer/Script.cpp b/hurricane/src/viewer/Script.cpp index 954d62c5..c698d2f9 100644 --- a/hurricane/src/viewer/Script.cpp +++ b/hurricane/src/viewer/Script.cpp @@ -1,8 +1,7 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC 2008-2014, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | diff --git a/katabatic/src/CMakeLists.txt b/katabatic/src/CMakeLists.txt index 007d6a74..ab6c4b2a 100644 --- a/katabatic/src/CMakeLists.txt +++ b/katabatic/src/CMakeLists.txt @@ -16,6 +16,7 @@ endif ( CHECK_DETERMINISM ) ) set ( includes katabatic/Constants.h katabatic/Observer.h + katabatic/NetRoutingProperty.h katabatic/Configuration.h katabatic/ChipTools.h katabatic/AutoContact.h @@ -37,6 +38,7 @@ endif ( CHECK_DETERMINISM ) set ( mocIncludes katabatic/GraphicKatabaticEngine.h ) set ( cpps Configuration.cpp Observer.cpp + NetRoutingProperty.cpp ChipTools.cpp AutoContact.cpp AutoContactTerminal.cpp diff --git a/katabatic/src/KatabaticEngine.cpp b/katabatic/src/KatabaticEngine.cpp index 09f92b46..5ffceefa 100644 --- a/katabatic/src/KatabaticEngine.cpp +++ b/katabatic/src/KatabaticEngine.cpp @@ -153,7 +153,9 @@ namespace Katabatic { , _configuration (new ConfigurationConcrete()) , _gcellGrid (NULL) , _chipTools (cell) - , _routingNets () + , _autoSegmentLut () + , _autoContactLut () + , _netRoutingStates () { addMeasure( cell, "Gates" , AllianceFramework::getInstancesCount(cell,AllianceFramework::IgnoreFeeds @@ -459,7 +461,57 @@ namespace Katabatic { { return _configuration; } - void KatabaticEngine::loadGlobalRouting ( unsigned int method, NetSet& nets, const map& excludeds ) + void KatabaticEngine::findSpecialNets () + { + AllianceFramework* af = AllianceFramework::get(); + forEach ( Net*, net, _cell->getNets() ) { + + const char* excludedType = NULL; + if (net->getType() == Net::Type::POWER ) excludedType = "POWER"; + if (net->getType() == Net::Type::GROUND) excludedType = "GROUND"; + //if (net->getType() == Net::Type::CLOCK ) excludedType = "CLOCK"; + if (excludedType) { + cparanoid << Warning( "%s is not a routable net (%s,excluded)." + , getString(*net).c_str(), excludedType ) << endl; + } + if (af->isBLOCKAGE(net->getName())) excludedType = "BLOCKAGE"; + if (excludedType) { + NetRoutingState* state = getRoutingState( *net, KbCreate ); + state->setFlags( NetRoutingState::Fixed ); + } + } // forEach( Net* ) + } + + + NetRoutingState* KatabaticEngine::getRoutingState ( Net* net, unsigned int flags ) + { + NetRoutingState* state = NetRoutingExtension::get( net ); + + if (state) { + NetRoutingStates::iterator istate = _netRoutingStates.find( net->getName() ); + if (istate != _netRoutingStates.end()) { + if (istate->second != state) { + cerr << Error( "KatabaticEngine::updateRoutingStates() - %s incoherency between property and LUT:\n" + " Property:%x vs. LUT:%x, re-init LUT from property." + , getString(net->getName()).c_str() + , (void*)state + , (void*)(istate->second)) << endl; + _netRoutingStates.insert( make_pair(net->getName(), state) ); + } + return state; + } + } else { + if (not (flags & KbCreate)) return NULL; + + state = NetRoutingExtension::create( net ); + } + + _netRoutingStates.insert( make_pair(net->getName(), state) ); + return state; + } + + + void KatabaticEngine::loadGlobalRouting ( unsigned int method ) { if (_state < EngineGlobalLoaded) throw Error ("KatabaticEngine::loadGlobalRouting() : global routing not present yet."); @@ -467,40 +519,6 @@ namespace Katabatic { if (_state > EngineGlobalLoaded) throw Error ("KatabaticEngine::loadGlobalRouting() : global routing already loaded."); - AllianceFramework* af = AllianceFramework::get(); - if (nets.empty()) { - forEach ( Net*, net, _cell->getNets() ) { - const char* excludedType = NULL; - if (net->getType() == Net::Type::POWER ) excludedType = "POWER"; - if (net->getType() == Net::Type::GROUND) excludedType = "GROUND"; - if (net->getType() == Net::Type::CLOCK ) excludedType = "CLOCK"; - if (excludedType) { - cparanoid << Warning( "%s is not a routable net (%s,excluded)." - , getString(*net).c_str(), excludedType ) << endl; - continue; - } - if (af->isBLOCKAGE(net->getName())) continue; - if (excludeds.find(net->getName()) != excludeds.end()) continue; - _routingNets.insert ( *net ); - } - } else { - NetSet::iterator it = nets.begin(); - for ( ; it != nets.end() ; it++ ) { - const char* excludedType = NULL; - if ((*it)->getType() == Net::Type::POWER ) excludedType = "POWER"; - if ((*it)->getType() == Net::Type::GROUND) excludedType = "GROUND"; - if ((*it)->getType() == Net::Type::CLOCK ) excludedType = "CLOCK"; - if (af->isBLOCKAGE((*it)->getName())) excludedType = "BLOCKAGE"; - if (excludedType) { - cparanoid << Warning( "%s is not a routable net (%s), removed from set." - , getString(*it).c_str(), excludedType ) << endl; - } else { - if (excludeds.find((*it)->getName()) != excludeds.end()) continue; - _routingNets.insert( *it ); - } - } - } - switch ( method ) { case EngineLoadGrByNet: _loadGrByNet(); break; case EngineLoadGrByGCell: @@ -825,9 +843,9 @@ namespace Katabatic { record->add( getSlot( "_configuration" , _configuration ) ); record->add( getSlot( "_gcellGrid" , _gcellGrid ) ); record->add( getSlot( "_chipTools" , _chipTools ) ); - record->add( getSlot( "_routingNets" , &_routingNets ) ); record->add( getSlot( "_autoContactLut" , &_autoContactLut ) ); record->add( getSlot( "_autoSegmentLut" , &_autoSegmentLut ) ); + record->add( getSlot( "_netRoutingStates", &_netRoutingStates) ); return record; } diff --git a/katabatic/src/LayerAssign.cpp b/katabatic/src/LayerAssign.cpp index ec49236d..e9d072ec 100644 --- a/katabatic/src/LayerAssign.cpp +++ b/katabatic/src/LayerAssign.cpp @@ -28,6 +28,7 @@ #include "hurricane/Instance.h" #include "hurricane/Vertical.h" #include "hurricane/Horizontal.h" +#include "hurricane/Cell.h" #include "crlcore/RoutingGauge.h" #include "katabatic/AutoContact.h" #include "katabatic/AutoSegment.h" @@ -131,9 +132,11 @@ namespace Katabatic { { cmess1 << " o Assign Layer (simple wirelength)." << endl; - NetSet::iterator inet = _routingNets.begin(); - for ( ; inet != _routingNets.end() ; ++inet ) - _layerAssignByLength ( *inet, total, global, globalNets ); + forEach ( Net* , inet , getCell()->getNets() ) { + if (NetRoutingExtension::get(*inet)->isAutomaticGlobalRoute()) { + _layerAssignByLength ( *inet, total, global, globalNets ); + } + } // forEach(Net*) } @@ -188,9 +191,11 @@ namespace Katabatic { { cmess1 << " o Assign Layer (whole net trunk)." << endl; - NetSet::iterator inet = _routingNets.begin(); - for ( ; inet != _routingNets.end() ; ++inet ) - _layerAssignByTrunk( *inet, globalNets, total, global ); + forEach ( Net* , inet , getCell()->getNets() ) { + if (NetRoutingExtension::get(*inet)->isAutomaticGlobalRoute()) { + _layerAssignByTrunk( *inet, globalNets, total, global ); + } + } } diff --git a/katabatic/src/LoadGrByNet.cpp b/katabatic/src/LoadGrByNet.cpp index 0d2ba954..5661218a 100644 --- a/katabatic/src/LoadGrByNet.cpp +++ b/katabatic/src/LoadGrByNet.cpp @@ -1799,13 +1799,14 @@ namespace Katabatic { startMeasures(); Session::open( this ); - NetSet::iterator inet = _routingNets.begin(); - while ( inet != _routingNets.end() ) { - DebugSession::open( *inet, 80 ); - _loadNetGlobalRouting( *(inet++) ); - Session::revalidate(); - DebugSession::close(); - } + forEach ( Net*, inet, getCell()->getNets() ) { + if (NetRoutingExtension::isAutomaticGlobalRoute(*inet)) { + DebugSession::open( *inet, 80 ); + _loadNetGlobalRouting( *inet ); + Session::revalidate(); + DebugSession::close(); + } + } // forEach(Net*) #if defined(CHECK_DATABASE) _check ( "after Katabatic loading" ); @@ -1889,7 +1890,8 @@ namespace Katabatic { cerr << Warning("More than 10 unconnected RoutingPads (%u) on %s, missing global routing?" ,unconnecteds, getString(net->getName()).c_str() ) << endl; - _routingNets.erase( net ); + NetRoutingExtension::create( net )->setFlags ( NetRoutingState::Excluded ); + NetRoutingExtension::create( net )->unsetFlags( NetRoutingState::AutomaticGlobalRoute ); ltraceout(99); return; } diff --git a/katabatic/src/NetRoutingProperty.cpp b/katabatic/src/NetRoutingProperty.cpp new file mode 100644 index 00000000..c483d0a1 --- /dev/null +++ b/katabatic/src/NetRoutingProperty.cpp @@ -0,0 +1,138 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2014-2014, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./NetRoutingProperty.cpp" | +// +-----------------------------------------------------------------+ + + +#include "katabatic/NetRoutingProperty.h" +#include "hurricane/Net.h" + + +namespace Katabatic { + + using namespace std; + using Hurricane::Property; + + + string NetRoutingState::_getString () const + { + string s; + + if (isFixed ()) s += 'f'; + if (isManualGlobalRoute ()) s += 'm'; + if (isAutomaticGlobalRoute()) s += 'a'; + + return s; + } + + + Record* NetRoutingState::_getRecord () const + { + Record* record = new Record ( "" ); + if (record != NULL) { + record->add( getSlot("_net" , _net ) ); + record->add( getSlot("_flags", _flags ) ); + } + return record; + } + + +// ------------------------------------------------------------------- +// Class : "NetRoutingProperty" + + Name NetRoutingProperty::_name = "Katabatic NetRouting State"; + + + NetRoutingProperty* NetRoutingProperty::create ( Net* owner ) + { + NetRoutingProperty *property = new NetRoutingProperty( owner ); + + property->_postCreate (); + return property; + } + + + void NetRoutingProperty::onReleasedBy ( DBo* owner ) + { + _state.setNet( NULL ); + PrivateProperty::onReleasedBy( owner ); + } + + + Name NetRoutingProperty::getPropertyName () + { return _name; } + + + Name NetRoutingProperty::getName () const + { return getPropertyName(); } + + + string NetRoutingProperty::_getTypeName () const + { return _TName ( "NetRoutingProperty" ); } + + + string NetRoutingProperty::_getString () const + { + string s = PrivateProperty::_getString (); + s.insert ( s.length() - 1 , " " + getString(&_state) ); + + return s; + } + + + Record* NetRoutingProperty::_getRecord () const + { + Record* record = PrivateProperty::_getRecord(); + if ( record ) { + record->add( getSlot("_name" , _name ) ); + record->add( getSlot("_state",&_state) ); + } + return record; + } + + +// ------------------------------------------------------------------- +// Class : "NetRoutingExtension" + + + const Net* NetRoutingExtension::_owner = NULL; + NetRoutingState* NetRoutingExtension::_cache = NULL; + + + NetRoutingState* NetRoutingExtension::get ( const Net* net ) + { + if (net == _owner) return _cache; + _owner = net; + + Property* property = _owner->getProperty( NetRoutingProperty::getPropertyName() ); + if (property) _cache = static_cast(property)->getState(); + else _cache = NULL; + + return _cache; + } + + + NetRoutingState* NetRoutingExtension::create ( Net* net ) + { + get( net ); + if (_cache) return _cache; + + NetRoutingProperty* property = new NetRoutingProperty( net ); + net->put( property ); + + _cache = property->getState(); + return _cache; + } + + +} // Katabatic namespace. diff --git a/katabatic/src/katabatic/Constants.h b/katabatic/src/katabatic/Constants.h index b372c41d..e53ce8bd 100644 --- a/katabatic/src/katabatic/Constants.h +++ b/katabatic/src/katabatic/Constants.h @@ -46,6 +46,7 @@ namespace Katabatic { , KbHalfSlacken = 0x00800000 , KbNoGCellShrink = 0x01000000 , KbCParanoid = 0x02000000 + , KbCreate = 0x04000000 , KbDirectionMask = KbHorizontal|KbVertical }; diff --git a/katabatic/src/katabatic/KatabaticEngine.h b/katabatic/src/katabatic/KatabaticEngine.h index 10136b39..2f235e68 100644 --- a/katabatic/src/katabatic/KatabaticEngine.h +++ b/katabatic/src/katabatic/KatabaticEngine.h @@ -43,6 +43,7 @@ namespace CRL { #include "katabatic/Constants.h" #include "katabatic/Configuration.h" +#include "katabatic/NetRoutingProperty.h" #include "katabatic/GCell.h" #include "katabatic/AutoSegments.h" #include "katabatic/AutoContact.h" @@ -84,114 +85,119 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "KatabaticEngine". + typedef map NetRoutingStates; + class KatabaticEngine : public ToolEngine { public: typedef set NetSet; public: // Constructor. - static KatabaticEngine* create ( Cell* ); + static KatabaticEngine* create ( Cell* ); // Accessors. - static KatabaticEngine* get ( const Cell* ); - static const Name& staticGetName (); - inline bool isGMetal ( const Layer* ) const; - inline bool isGContact ( const Layer* ) const; - inline bool isChip () const; - inline bool isInDemoMode () const; - inline bool doWarnOnGCellOverload () const; - inline bool doDestroyBaseContact () const; - inline bool doDestroyBaseSegment () const; - inline bool doDestroyTool () const; - virtual const Name& getName () const; - inline EngineState getState () const; - inline unsigned int getFlags ( unsigned int mask ) const; - inline Configuration* getKatabaticConfiguration (); - virtual Configuration* getConfiguration (); - inline CellGauge* getCellGauge () const; - inline RoutingGauge* getRoutingGauge () const; - inline RoutingLayerGauge* getLayerGauge ( size_t depth ) const; - inline const Layer* getRoutingLayer ( size_t depth ) const ; - inline Layer* getContactLayer ( size_t depth ) const ; - inline GCellGrid* getGCellGrid () const; - inline const NetSet& getRoutingNets () const; - inline DbU::Unit getGlobalThreshold () const; - inline float getSaturateRatio () const; - inline size_t getSaturateRp () const; - inline DbU::Unit getExtensionCap () const; - inline const ChipTools& getChipTools () const; - void xmlWriteGCellGrid ( ostream& ); - void xmlWriteGCellGrid ( const string& ); - // Modifiers. - inline void setState ( EngineState state ); - inline void setFlags ( unsigned int ); - inline void unsetFlags ( unsigned int ); - inline void setGlobalThreshold ( DbU::Unit ); - inline void setSaturateRatio ( float ); - inline void setSaturateRp ( size_t ); - void startMeasures (); - void stopMeasures (); - void printMeasures ( const string& ) const; - void refresh ( unsigned int flags=KbOpenSession ); - virtual void createDetailedGrid (); - void chipPrep (); - void makePowerRails (); - virtual void loadGlobalRouting ( unsigned int method, NetSet&, const std::map& ); - void slackenBorder ( Box bb, Layer::Mask, unsigned int flags ); - void slackenBlockIos ( Instance* core ); - bool moveUpNetTrunk ( AutoSegment*, set& globalNets, GCell::SetIndex& invalidateds ); - void moveULeft ( AutoSegment*, set& globalNets, GCell::SetIndex& invalidateds ); - void moveURight ( AutoSegment*, set& globalNets, GCell::SetIndex& invalidateds ); - void balanceGlobalDensity (); - void layerAssign ( unsigned int method ); - void updateNetTopology ( Net* ); - void computeNetConstraints ( Net* ); - void toOptimals ( Net* ); - virtual void finalizeLayout (); - // Internal Modifiers. - void _computeNetOptimals ( Net* ); - void _computeNetTerminals ( Net* ); - bool _check ( const char* message=NULL ) const; - void _check ( Net* ) const; - void _gutKatabatic (); - void _link ( AutoContact* ); - void _link ( AutoSegment* ); - void _unlink ( AutoContact* ); - void _unlink ( AutoSegment* ); - AutoContact* _lookup ( Contact* ) const; - AutoSegment* _lookup ( Segment* ) const; - void _destroyAutoSegments (); - void _destroyAutoContacts (); - void _loadGrByNet (); - void _loadNetGlobalRouting ( Net* ); - void _alignate ( Net* ); - void _balanceGlobalDensity ( unsigned int depth ); - void _desaturate ( unsigned int depth, set&, unsigned long& total, unsigned long& globals ); - void _layerAssignByLength ( unsigned long& total, unsigned long& global, set& ); - void _layerAssignByLength ( Net*, unsigned long& total, unsigned long& global, set& ); - void _layerAssignByTrunk ( unsigned long& total, unsigned long& global, set& ); - void _layerAssignByTrunk ( Net*, set&, unsigned long& total, unsigned long& global ); - void _saveNet ( Net* ); - void _print () const; - void _print ( Net* ) const; - inline const AutoContactLut& _getAutoContactLut () const; - inline const AutoSegmentLut& _getAutoSegmentLut () const; - // Inspector Management. - virtual Record* _getRecord () const; - virtual string _getString () const; - virtual string _getTypeName () const; + static KatabaticEngine* get ( const Cell* ); + static const Name& staticGetName (); + inline bool isGMetal ( const Layer* ) const; + inline bool isGContact ( const Layer* ) const; + inline bool isChip () const; + inline bool isInDemoMode () const; + inline bool doWarnOnGCellOverload () const; + inline bool doDestroyBaseContact () const; + inline bool doDestroyBaseSegment () const; + inline bool doDestroyTool () const; + virtual const Name& getName () const; + inline EngineState getState () const; + inline unsigned int getFlags ( unsigned int mask ) const; + inline Configuration* getKatabaticConfiguration (); + virtual Configuration* getConfiguration (); + inline CellGauge* getCellGauge () const; + inline RoutingGauge* getRoutingGauge () const; + inline RoutingLayerGauge* getLayerGauge ( size_t depth ) const; + inline const Layer* getRoutingLayer ( size_t depth ) const ; + inline Layer* getContactLayer ( size_t depth ) const ; + inline GCellGrid* getGCellGrid () const; + inline const NetSet& getRoutingNets () const; + inline DbU::Unit getGlobalThreshold () const; + inline float getSaturateRatio () const; + inline size_t getSaturateRp () const; + inline DbU::Unit getExtensionCap () const; + inline const ChipTools& getChipTools () const; + inline const NetRoutingStates& getNetRoutingStates () const; + void xmlWriteGCellGrid ( ostream& ); + void xmlWriteGCellGrid ( const string& ); + // Modifiers. + inline void setState ( EngineState state ); + inline void setFlags ( unsigned int ); + inline void unsetFlags ( unsigned int ); + inline void setGlobalThreshold ( DbU::Unit ); + inline void setSaturateRatio ( float ); + inline void setSaturateRp ( size_t ); + void startMeasures (); + void stopMeasures (); + void printMeasures ( const string& ) const; + void refresh ( unsigned int flags=KbOpenSession ); + virtual void createDetailedGrid (); + void chipPrep (); + void findSpecialNets (); + void makePowerRails (); + virtual void loadGlobalRouting ( unsigned int method ); + void slackenBorder ( Box bb, Layer::Mask, unsigned int flags ); + void slackenBlockIos ( Instance* core ); + bool moveUpNetTrunk ( AutoSegment*, set& globalNets, GCell::SetIndex& invalidateds ); + void moveULeft ( AutoSegment*, set& globalNets, GCell::SetIndex& invalidateds ); + void moveURight ( AutoSegment*, set& globalNets, GCell::SetIndex& invalidateds ); + void balanceGlobalDensity (); + void layerAssign ( unsigned int method ); + void updateNetTopology ( Net* ); + void computeNetConstraints ( Net* ); + void toOptimals ( Net* ); + virtual void finalizeLayout (); + // Internal Modifiers. + NetRoutingState* getRoutingState ( Net*, unsigned int flags=KbNoFlags ); + void _computeNetOptimals ( Net* ); + void _computeNetTerminals ( Net* ); + bool _check ( const char* message=NULL ) const; + void _check ( Net* ) const; + void _gutKatabatic (); + void _link ( AutoContact* ); + void _link ( AutoSegment* ); + void _unlink ( AutoContact* ); + void _unlink ( AutoSegment* ); + AutoContact* _lookup ( Contact* ) const; + AutoSegment* _lookup ( Segment* ) const; + void _destroyAutoSegments (); + void _destroyAutoContacts (); + void _loadGrByNet (); + void _loadNetGlobalRouting ( Net* ); + void _alignate ( Net* ); + void _balanceGlobalDensity ( unsigned int depth ); + void _desaturate ( unsigned int depth, set&, unsigned long& total, unsigned long& globals ); + void _layerAssignByLength ( unsigned long& total, unsigned long& global, set& ); + void _layerAssignByLength ( Net*, unsigned long& total, unsigned long& global, set& ); + void _layerAssignByTrunk ( unsigned long& total, unsigned long& global, set& ); + void _layerAssignByTrunk ( Net*, set&, unsigned long& total, unsigned long& global ); + void _saveNet ( Net* ); + void _print () const; + void _print ( Net* ) const; + inline const AutoContactLut& _getAutoContactLut () const; + inline const AutoSegmentLut& _getAutoSegmentLut () const; + // Inspector Management. + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const; protected: // Attributes. - static Name _toolName; - Timer _timer; - EngineState _state; - unsigned int _flags; - Configuration* _configuration; - GCellGrid* _gcellGrid; - ChipTools _chipTools; - NetSet _routingNets; - AutoSegmentLut _autoSegmentLut; - AutoContactLut _autoContactLut; + static Name _toolName; + Timer _timer; + EngineState _state; + unsigned int _flags; + Configuration* _configuration; + GCellGrid* _gcellGrid; + ChipTools _chipTools; + AutoSegmentLut _autoSegmentLut; + AutoContactLut _autoContactLut; + NetRoutingStates _netRoutingStates; protected: // Constructors & Destructors. @@ -227,7 +233,6 @@ namespace Katabatic { inline const Layer* KatabaticEngine::getRoutingLayer ( size_t depth ) const { return _configuration->getRoutingLayer(depth); } inline Layer* KatabaticEngine::getContactLayer ( size_t depth ) const { return _configuration->getContactLayer(depth); } inline GCellGrid* KatabaticEngine::getGCellGrid () const { return _gcellGrid; } - inline const KatabaticEngine::NetSet& KatabaticEngine::getRoutingNets () const { return _routingNets; } inline DbU::Unit KatabaticEngine::getGlobalThreshold () const { return _configuration->getGlobalThreshold(); } inline float KatabaticEngine::getSaturateRatio () const { return _configuration->getSaturateRatio(); } inline size_t KatabaticEngine::getSaturateRp () const { return _configuration->getSaturateRp(); } @@ -236,6 +241,7 @@ namespace Katabatic { inline void KatabaticEngine::setState ( EngineState state ) { _state = state; } inline bool KatabaticEngine::isChip () const { return _chipTools.isChip(); } inline const ChipTools& KatabaticEngine::getChipTools () const { return _chipTools; } + inline const NetRoutingStates& KatabaticEngine::getNetRoutingStates () const { return _netRoutingStates; } // ------------------------------------------------------------------- diff --git a/katabatic/src/katabatic/NetRoutingProperty.h b/katabatic/src/katabatic/NetRoutingProperty.h new file mode 100644 index 00000000..a1a5f061 --- /dev/null +++ b/katabatic/src/katabatic/NetRoutingProperty.h @@ -0,0 +1,195 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2014-2014, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./katabatic/NetRoutingProperty.h" | +// +-----------------------------------------------------------------+ + + +#ifndef KATABATIC_NET_ROUTING_PROPERTY_H +#define KATABATIC_NET_ROUTING_PROPERTY_H + +#include +#include +#include "hurricane/Name.h" +#include "hurricane/Property.h" +#include "hurricane/Slot.h" + +namespace Hurricane { + class Net; +} + +namespace Katabatic { + + using Hurricane::_TName; + using Hurricane::Name; + using Hurricane::Record; + using Hurricane::PrivateProperty; + using Hurricane::DBo; + using Hurricane::Net; + + class NetRoutingProperty; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::NetRoutingState". + + class NetRoutingState { + friend class NetRoutingProperty; + friend class NetRoutingExtension; + + public: + enum State { Excluded = 0x0001 + , Fixed = 0x0002 + , ManualGlobalRoute = 0x0004 + , AutomaticGlobalRoute = 0x0008 + , MixedPreRoute = Fixed|ManualGlobalRoute + }; + public: + inline bool isFixed () const; + inline bool isManualGlobalRoute () const; + inline bool isAutomaticGlobalRoute () const; + inline bool isMixedPreRoute () const; + inline unsigned int getFlags () const; + inline void setFlags ( unsigned int mask ); + inline void unsetFlags ( unsigned int mask ); + inline Net* getNet () const; + std::string _getString () const; + Record* _getRecord () const; + private: + inline NetRoutingState ( Net*, unsigned int flags=0 ); + NetRoutingState ( const NetRoutingState& ) = delete; + inline void setNet ( Net* ); + private: + Net* _net; + unsigned int _flags; + }; + + + inline NetRoutingState::NetRoutingState ( Net* net, unsigned int flags ) : _net(net), _flags(flags) { } + + inline bool NetRoutingState::isFixed () const { return _flags & Fixed; }; + inline bool NetRoutingState::isManualGlobalRoute () const { return _flags & ManualGlobalRoute; }; + inline bool NetRoutingState::isAutomaticGlobalRoute () const { return _flags & AutomaticGlobalRoute; }; + inline bool NetRoutingState::isMixedPreRoute () const { return _flags & MixedPreRoute; }; + inline unsigned int NetRoutingState::getFlags () const { return _flags; }; + inline Net* NetRoutingState::getNet () const { return _net; } + inline void NetRoutingState::setFlags ( unsigned int mask ) { _flags |= mask; } + inline void NetRoutingState::unsetFlags ( unsigned int mask ) { _flags &= ~mask; } + inline void NetRoutingState::setNet ( Net* net ) { _net = net; } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::NetRoutingProperty". + + class NetRoutingProperty : public PrivateProperty { + friend class NetRoutingExtension; + public: + static Name _name; + public: + static NetRoutingProperty* create ( Net* owner ); + static Name getPropertyName (); + virtual Name getName () const; + inline NetRoutingState* getState (); + virtual void onReleasedBy ( DBo* owner ); + virtual std::string _getTypeName () const; + virtual std::string _getString () const; + virtual Record* _getRecord () const; + protected: + // Attributes. + NetRoutingState _state; + + protected: + // Constructor. + inline NetRoutingProperty ( Net* owner ); + }; + + + inline NetRoutingProperty::NetRoutingProperty ( Net* owner ) : PrivateProperty(), _state(owner) { } + inline NetRoutingState* NetRoutingProperty::getState () { return &_state; } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::NetRoutingExtension". + + class NetRoutingExtension { + public: + static inline bool isFixed ( const Net* ); + static inline bool isManualGlobalRoute ( const Net* ); + static inline bool isAutomaticGlobalRoute ( const Net* ); + static inline bool isMixedPreRoute ( const Net* ); + static inline unsigned int getFlags ( const Net* ); + static inline void setFlags ( const Net*, unsigned int mask ); + static inline void unsetFlags ( const Net*, unsigned int mask ); + static NetRoutingState* get ( const Net* ); + static NetRoutingState* create ( Net* ); + private: + static const Net* _owner; + static NetRoutingState* _cache; + }; + + + inline bool NetRoutingExtension::isFixed ( const Net* net ) + { + NetRoutingState* state = get( net ); + return (state == NULL) ? false : state->isFixed(); + } + + + inline bool NetRoutingExtension::isManualGlobalRoute ( const Net* net ) + { + NetRoutingState* state = get( net ); + return (state == NULL) ? false : state->isManualGlobalRoute(); + } + + + inline bool NetRoutingExtension::isAutomaticGlobalRoute ( const Net* net ) + { + NetRoutingState* state = get( net ); + return (state == NULL) ? true : state->isAutomaticGlobalRoute(); + } + + + inline bool NetRoutingExtension::isMixedPreRoute ( const Net* net ) + { + NetRoutingState* state = get( net ); + return (state == NULL) ? false : state->isMixedPreRoute(); + } + + + inline unsigned int NetRoutingExtension::getFlags ( const Net* net ) + { + NetRoutingState* state = get( net ); + return (state == NULL) ? 0 : state->getFlags(); + } + + + inline void NetRoutingExtension::setFlags ( const Net* net, unsigned int mask ) + { + NetRoutingState* state = get( net ); + if (state != NULL) state->setFlags( mask ); + } + + + inline void NetRoutingExtension::unsetFlags ( const Net* net, unsigned int mask ) + { + NetRoutingState* state = get( net ); + if (state != NULL) state->unsetFlags( mask ); + } + + +} // Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::NetRoutingState); + + +#endif // KATABATIC_NET_ROUTING_PROPERTY_H diff --git a/kite/src/BuildPowerRails.cpp b/kite/src/BuildPowerRails.cpp index 913eee9f..bc2ec0bc 100644 --- a/kite/src/BuildPowerRails.cpp +++ b/kite/src/BuildPowerRails.cpp @@ -31,6 +31,7 @@ #include "hurricane/Path.h" #include "hurricane/Query.h" #include "crlcore/AllianceFramework.h" +#include "katabatic/NetRoutingProperty.h" #include "kite/RoutingPlane.h" #include "kite/TrackFixedSegment.h" #include "kite/Track.h" @@ -68,6 +69,7 @@ namespace { using Hurricane::DataBase; using CRL::AllianceFramework; using Katabatic::ChipTools; + using Katabatic::NetRoutingExtension; using namespace Kite; @@ -236,10 +238,8 @@ namespace { _vssiName = ""; _ckoName = ""; - map preRouteds = kite->getPreRouteds(); - forEach ( Net*, inet, topCell->getNets() ) { - if (preRouteds.find(inet->getName()) != preRouteds.end()) continue; + if (NetRoutingExtension::isManualGlobalRoute(*inet)) continue; Net::Type netType = inet->getType(); if (netType == Net::Type::POWER) { @@ -1161,6 +1161,7 @@ namespace Kite { using Hurricane::Technology; using Hurricane::BasicLayer; using Hurricane::ForEachIterator; + using Katabatic::NetRoutingState; void KiteEngine::buildPowerRails () @@ -1169,6 +1170,9 @@ namespace Kite { _blockageNet = getCell()->getNet("blockagenet"); if (not _blockageNet) _blockageNet = Net::create( getCell(), "blockagenet" ); + + NetRoutingState* state = getRoutingState( _blockageNet, Katabatic::KbCreate ); + state->setFlags( NetRoutingState::Fixed ); } QueryPowerRails query ( this ); diff --git a/kite/src/BuildPreRouteds.cpp b/kite/src/BuildPreRouteds.cpp index e22b442a..263ad77e 100644 --- a/kite/src/BuildPreRouteds.cpp +++ b/kite/src/BuildPreRouteds.cpp @@ -31,6 +31,7 @@ #include "hurricane/Path.h" #include "hurricane/Query.h" #include "crlcore/AllianceFramework.h" +#include "katabatic/NetRoutingProperty.h" #include "katabatic/AutoContact.h" #include "kite/RoutingPlane.h" #include "kite/TrackFixedSegment.h" @@ -40,6 +41,12 @@ namespace { + +} // Anonymous namespace. + + +namespace Kite { + using namespace std; using Hurricane::tab; using Hurricane::inltrace; @@ -68,22 +75,12 @@ namespace { using Hurricane::Technology; using Hurricane::DataBase; using CRL::AllianceFramework; + using Hurricane::ForEachIterator; + using Katabatic::NetRoutingExtension; + using Katabatic::NetRoutingState; using Katabatic::AutoContact; using Katabatic::AutoSegment; using Katabatic::ChipTools; - using namespace Kite; - - -} // Anonymous namespace. - - -namespace Kite { - - - using Hurricane::DataBase; - using Hurricane::Technology; - using Hurricane::BasicLayer; - using Hurricane::ForEachIterator; void KiteEngine::buildPreRouteds () @@ -131,7 +128,9 @@ namespace Kite { } if (isPreRouted or (rpCount < 2)) { - _preRouteds.insert( make_pair(inet->getName(),*inet) ); + NetRoutingState* state = getRoutingState( *inet, Katabatic::KbCreate ); + state->setFlags ( NetRoutingState::ManualGlobalRoute ); + state->unsetFlags( NetRoutingState::AutomaticGlobalRoute ); if (rpCount > 1) { for ( auto icontact : contacts ) { @@ -148,7 +147,7 @@ namespace Kite { } } - Session::revalidate (); + Session::revalidate(); } diff --git a/kite/src/GraphicKiteEngine.cpp b/kite/src/GraphicKiteEngine.cpp index 8f2fcdf2..89341520 100644 --- a/kite/src/GraphicKiteEngine.cpp +++ b/kite/src/GraphicKiteEngine.cpp @@ -173,13 +173,11 @@ namespace Kite { void GraphicKiteEngine::_loadGlobalRouting () { - static KatabaticEngine::NetSet routingNets; - KiteEngine* kite = getForFramework( NoFlags ); if (cmess1.enabled()) kite->printConfiguration(); _viewer->clearToolInterrupt(); - kite->loadGlobalRouting( Katabatic::EngineLoadGrByNet, routingNets ); + kite->loadGlobalRouting( Katabatic::EngineLoadGrByNet ); } diff --git a/kite/src/KiteEngine.cpp b/kite/src/KiteEngine.cpp index 841bdea5..0d74dd65 100644 --- a/kite/src/KiteEngine.cpp +++ b/kite/src/KiteEngine.cpp @@ -57,6 +57,7 @@ namespace Kite { using std::ostringstream; using std::setprecision; using std::vector; + using std::make_pair; using Hurricane::DebugSession; using Hurricane::tab; using Hurricane::inltrace; @@ -100,16 +101,15 @@ namespace Kite { KiteEngine::KiteEngine ( Cell* cell ) - : KatabaticEngine (cell) - , _viewer (NULL) - , _knik (NULL) - , _blockageNet (NULL) - , _configuration (new Configuration(getKatabaticConfiguration())) - , _preRouteds () - , _routingPlanes () - , _negociateWindow(NULL) - , _minimumWL (0.0) - , _toolSuccess (false) + : KatabaticEngine (cell) + , _viewer (NULL) + , _knik (NULL) + , _blockageNet (NULL) + , _configuration (new Configuration(getKatabaticConfiguration())) + , _routingPlanes () + , _negociateWindow (NULL) + , _minimumWL (0.0) + , _toolSuccess (false) { } @@ -127,6 +127,7 @@ namespace Kite { Session::open( this ); createGlobalGraph( KtNoFlags ); createDetailedGrid(); + findSpecialNets(); buildPreRouteds(); buildPowerRails(); protectRoutingPads(); @@ -540,7 +541,12 @@ namespace Kite { _knik->loadSolution(); } else { annotateGlobalGraph(); - _knik->run( getPreRouteds() ); + map preRouteds; + for ( auto istate : getNetRoutingStates() ) { + if (istate.second->isMixedPreRoute()) + preRouteds.insert( make_pair(istate.first, istate.second->getNet()) ); + } + _knik->run( preRouteds ); } setState( Katabatic::EngineGlobalLoaded ); @@ -549,9 +555,9 @@ namespace Kite { } - void KiteEngine::loadGlobalRouting ( unsigned int method, KatabaticEngine::NetSet& nets ) + void KiteEngine::loadGlobalRouting ( unsigned int method ) { - KatabaticEngine::loadGlobalRouting( method, nets, getPreRouteds() ); + KatabaticEngine::loadGlobalRouting( method ); Session::open( this ); getGCellGrid()->checkEdgeOverflow( getHTracksReservedLocal(), getVTracksReservedLocal() ); diff --git a/kite/src/KiteMain.cpp b/kite/src/KiteMain.cpp index c1c2a4de..5d84fc8c 100644 --- a/kite/src/KiteMain.cpp +++ b/kite/src/KiteMain.cpp @@ -142,7 +142,6 @@ int main ( int argc, char *argv[] ) } } - KatabaticEngine::NetSet routingNets; unsigned int globalFlags = (loadGlobal) ? Kite::KtLoadGlobalRouting : Kite::KtBuildGlobalRouting; @@ -152,7 +151,7 @@ int main ( int argc, char *argv[] ) kite->runGlobalRouter( globalFlags ); if (saveGlobal) kite->saveGlobalSolution (); - kite->loadGlobalRouting ( Katabatic::EngineLoadGrByNet, routingNets ); + kite->loadGlobalRouting ( Katabatic::EngineLoadGrByNet ); kite->balanceGlobalDensity(); kite->layerAssign ( Katabatic::EngineNoNetLayerAssign ); kite->runNegociate (); diff --git a/kite/src/PyKiteEngine.cpp b/kite/src/PyKiteEngine.cpp index 2a008b08..08b757b7 100644 --- a/kite/src/PyKiteEngine.cpp +++ b/kite/src/PyKiteEngine.cpp @@ -177,9 +177,9 @@ extern "C" { } if (kite->getViewer()) { - ExceptionWidget::catchAllWrapper( std::bind(&KiteEngine::loadGlobalRouting,kite,flags,*routingNets) ); + ExceptionWidget::catchAllWrapper( std::bind(&KiteEngine::loadGlobalRouting,kite,flags/*,*routingNets*/) ); } else { - kite->loadGlobalRouting(flags,*routingNets); + kite->loadGlobalRouting(flags/*,*routingNets*/); } } else { PyErr_SetString(ConstructorError, "KiteEngine.loadGlobalRouting(): Invalid number/bad type of parameter."); diff --git a/kite/src/kite/KiteEngine.h b/kite/src/kite/KiteEngine.h index 801c52c4..166d4131 100644 --- a/kite/src/kite/KiteEngine.h +++ b/kite/src/kite/KiteEngine.h @@ -60,80 +60,78 @@ namespace Kite { class KiteEngine : public KatabaticEngine { public: - static const Name& staticGetName (); - static KiteEngine* create ( Cell* ); - static KiteEngine* get ( const Cell* ); - public: - inline CellViewer* getViewer () const; - inline KatabaticEngine* base (); - inline Configuration* getKiteConfiguration (); - virtual Configuration* getConfiguration (); - inline const map& getPreRouteds () const; - inline Net* getBlockageNet (); - inline bool getToolSuccess () const; - inline unsigned long getEventsLimit () const; - inline unsigned int getRipupLimit ( unsigned int type ) const; - unsigned int getRipupLimit ( const TrackElement* ) const; - inline unsigned int getRipupCost () const; - inline size_t getHTracksReservedLocal () const; - inline size_t getVTracksReservedLocal () const; - virtual const Name& getName () const; + static const Name& staticGetName (); + static KiteEngine* create ( Cell* ); + static KiteEngine* get ( const Cell* ); + public: + inline CellViewer* getViewer () const; + inline KatabaticEngine* base (); + inline Configuration* getKiteConfiguration (); + virtual Configuration* getConfiguration (); + inline Net* getBlockageNet (); + inline bool getToolSuccess () const; + inline unsigned long getEventsLimit () const; + inline unsigned int getRipupLimit ( unsigned int type ) const; + unsigned int getRipupLimit ( const TrackElement* ) const; + inline unsigned int getRipupCost () const; + inline size_t getHTracksReservedLocal () const; + inline size_t getVTracksReservedLocal () const; + virtual const Name& getName () const; inline Configuration::PostEventCb_t& - getPostEventCb (); - inline NegociateWindow* getNegociateWindow (); - inline size_t getRoutingPlanesSize () const; - RoutingPlane* getRoutingPlaneByIndex ( size_t index ) const; - RoutingPlane* getRoutingPlaneByLayer ( const Layer* ) const; - Track* getTrackByPosition ( const Layer*, DbU::Unit axis, unsigned int mode=Constant::Nearest ) const; - inline void printConfiguration () const; - void printCompletion () const; - void dumpMeasures ( std::ostream& ) const; - void dumpMeasures () const; - inline void setViewer ( CellViewer* ); - inline void setPostEventCb ( Configuration::PostEventCb_t ); - inline void setEventLimit ( unsigned long ); - inline void setMinimumWL ( double ); - inline void setRipupLimit ( unsigned int type, unsigned int ); - inline void setRipupCost ( unsigned int ); - inline void setHTracksReservedLocal ( size_t ); - inline void setVTracksReservedLocal ( size_t ); - void buildPowerRails (); - void buildPreRouteds (); - void protectRoutingPads (); - void preProcess (); - void setInterrupt ( bool ); - void createGlobalGraph ( unsigned int mode ); - virtual void createDetailedGrid (); - void saveGlobalSolution (); - void annotateGlobalGraph (); - void setFixedPreRouted (); - void runNegociate ( unsigned int flags=KtNoFlags ); - void runGlobalRouter ( unsigned int mode ); - virtual void loadGlobalRouting ( unsigned int method, KatabaticEngine::NetSet& ); - virtual void finalizeLayout (); - void _gutKite (); - void _computeCagedConstraints (); - TrackElement* _lookup ( Segment* ) const; - inline TrackElement* _lookup ( AutoSegment* ) const; - bool _check ( unsigned int& overlap, const char* message=NULL ) const; - void _check ( Net* ) const; - virtual Record* _getRecord () const; - virtual string _getString () const; - virtual string _getTypeName () const; - - private: - // Attributes. - static Name _toolName; - protected: - CellViewer* _viewer; - Knik::KnikEngine* _knik; - Net* _blockageNet; - Configuration* _configuration; - map _preRouteds; - vector _routingPlanes; - NegociateWindow* _negociateWindow; - double _minimumWL; - mutable bool _toolSuccess; + getPostEventCb (); + inline NegociateWindow* getNegociateWindow (); + inline size_t getRoutingPlanesSize () const; + RoutingPlane* getRoutingPlaneByIndex ( size_t index ) const; + RoutingPlane* getRoutingPlaneByLayer ( const Layer* ) const; + Track* getTrackByPosition ( const Layer*, DbU::Unit axis, unsigned int mode=Constant::Nearest ) const; + inline void printConfiguration () const; + void printCompletion () const; + void dumpMeasures ( std::ostream& ) const; + void dumpMeasures () const; + inline void setViewer ( CellViewer* ); + inline void setPostEventCb ( Configuration::PostEventCb_t ); + inline void setEventLimit ( unsigned long ); + inline void setMinimumWL ( double ); + inline void setRipupLimit ( unsigned int type, unsigned int ); + inline void setRipupCost ( unsigned int ); + inline void setHTracksReservedLocal ( size_t ); + inline void setVTracksReservedLocal ( size_t ); + void buildPowerRails (); + void buildPreRouteds (); + void protectRoutingPads (); + void preProcess (); + void setInterrupt ( bool ); + void createGlobalGraph ( unsigned int mode ); + virtual void createDetailedGrid (); + void saveGlobalSolution (); + void annotateGlobalGraph (); + void setFixedPreRouted (); + void runNegociate ( unsigned int flags=KtNoFlags ); + void runGlobalRouter ( unsigned int mode ); + virtual void loadGlobalRouting ( unsigned int method ); + virtual void finalizeLayout (); + void _gutKite (); + void _computeCagedConstraints (); + TrackElement* _lookup ( Segment* ) const; + inline TrackElement* _lookup ( AutoSegment* ) const; + bool _check ( unsigned int& overlap, const char* message=NULL ) const; + void _check ( Net* ) const; + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const; + + private: + // Attributes. + static Name _toolName; + protected: + CellViewer* _viewer; + Knik::KnikEngine* _knik; + Net* _blockageNet; + Configuration* _configuration; + vector _routingPlanes; + NegociateWindow* _negociateWindow; + double _minimumWL; + mutable bool _toolSuccess; protected: // Constructors & Destructors. @@ -153,7 +151,6 @@ namespace Kite { inline KatabaticEngine* KiteEngine::base () { return static_cast(this); } inline Configuration* KiteEngine::getKiteConfiguration () { return _configuration; } inline Net* KiteEngine::getBlockageNet () { return _blockageNet; } - inline const map& KiteEngine::getPreRouteds () const { return _preRouteds; } inline Configuration::PostEventCb_t& KiteEngine::getPostEventCb () { return _configuration->getPostEventCb(); } inline bool KiteEngine::getToolSuccess () const { return _toolSuccess; } inline unsigned long KiteEngine::getEventsLimit () const { return _configuration->getEventsLimit(); } diff --git a/unicorn/src/CgtMain.cpp b/unicorn/src/CgtMain.cpp index a05930e1..f43ef677 100644 --- a/unicorn/src/CgtMain.cpp +++ b/unicorn/src/CgtMain.cpp @@ -400,7 +400,6 @@ int main ( int argc, char *argv[] ) unsigned int globalFlags = (loadGlobal) ? Kite::KtLoadGlobalRouting : Kite::KtBuildGlobalRouting; - static KatabaticEngine::NetSet routingNets; KiteEngine* kite = KiteEngine::create ( cell ); if ( showConf ) kite->printConfiguration (); @@ -408,7 +407,7 @@ int main ( int argc, char *argv[] ) if ( saveGlobal ) kite->saveGlobalSolution (); if ( detailedRoute ) { - kite->loadGlobalRouting ( Katabatic::EngineLoadGrByNet, routingNets ); + kite->loadGlobalRouting ( Katabatic::EngineLoadGrByNet ); kite->layerAssign ( Katabatic::EngineNoNetLayerAssign ); kite->runNegociate (); kiteSuccess = kite->getToolSuccess ();