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 e8cc3f3b..27fb14d2 100644 Binary files a/documentation/UsersGuide/images/Coriolis-Soft-Schema.pdf and b/documentation/UsersGuide/images/Coriolis-Soft-Schema.pdf differ diff --git a/documentation/UsersGuide/images/Coriolis-Soft-Schema.png b/documentation/UsersGuide/images/Coriolis-Soft-Schema.png index dd128ec6..40ab26b4 100644 Binary files a/documentation/UsersGuide/images/Coriolis-Soft-Schema.png and b/documentation/UsersGuide/images/Coriolis-Soft-Schema.png differ 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 00000000..fc1d4a5e Binary files /dev/null and b/documentation/UsersGuide/images/PR-DetailedPreRoute.pdf differ diff --git a/documentation/UsersGuide/images/PR-DetailedPreRoute.png b/documentation/UsersGuide/images/PR-DetailedPreRoute.png new file mode 100644 index 00000000..9596be44 Binary files /dev/null and b/documentation/UsersGuide/images/PR-DetailedPreRoute.png differ 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 ();