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.
This commit is contained in:
parent
7296dcd6fb
commit
20d25b2053
|
@ -1,15 +1,9 @@
|
||||||
|
|
||||||
// -*- C++ -*-
|
// -*- C++ -*-
|
||||||
//
|
//
|
||||||
// This file is part of the Coriolis Software.
|
// 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 |
|
// | C O R I O L I S |
|
||||||
// | Alliance / Hurricane Interface |
|
// | Alliance / Hurricane Interface |
|
||||||
// | |
|
// | |
|
||||||
|
@ -17,19 +11,15 @@
|
||||||
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
// | =============================================================== |
|
// | =============================================================== |
|
||||||
// | C++ Module : "./Catalog.cpp" |
|
// | C++ Module : "./Catalog.cpp" |
|
||||||
// | *************************************************************** |
|
// +-----------------------------------------------------------------+
|
||||||
// | U p d a t e s |
|
|
||||||
// | |
|
|
||||||
// x-----------------------------------------------------------------x
|
|
||||||
|
|
||||||
|
|
||||||
# include <iomanip>
|
# include <iomanip>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
#include "hurricane/Collection.h"
|
#include "hurricane/Collection.h"
|
||||||
#include "hurricane/Library.h"
|
#include "hurricane/Library.h"
|
||||||
#include "hurricane/Name.h"
|
#include "hurricane/Name.h"
|
||||||
|
|
||||||
#include "crlcore/Utilities.h"
|
#include "crlcore/Utilities.h"
|
||||||
#include "crlcore/Catalog.h"
|
#include "crlcore/Catalog.h"
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
|
|
||||||
// -*- C++ -*-
|
// -*- C++ -*-
|
||||||
//
|
//
|
||||||
// This file is part of the Coriolis Software.
|
// 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 |
|
// | C O R I O L I S |
|
||||||
|
@ -15,15 +14,14 @@
|
||||||
// +-----------------------------------------------------------------+
|
// +-----------------------------------------------------------------+
|
||||||
|
|
||||||
|
|
||||||
#ifndef __CRL_CATALOG_H__
|
#ifndef CRL_CATALOG_H
|
||||||
#define __CRL_CATALOG_H__
|
#define CRL_CATALOG_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include "hurricane/Name.h"
|
||||||
#include "hurricane/Name.h"
|
#include "hurricane/Property.h"
|
||||||
#include "hurricane/Property.h"
|
#include "hurricane/Slot.h"
|
||||||
#include "hurricane/Slot.h"
|
|
||||||
|
|
||||||
namespace Hurricane {
|
namespace Hurricane {
|
||||||
class Cell;
|
class Cell;
|
||||||
|
@ -406,4 +404,4 @@ INSPECTOR_P_SUPPORT(CRL::Catalog);
|
||||||
INSPECTOR_P_SUPPORT(CRL::Catalog::State);
|
INSPECTOR_P_SUPPORT(CRL::Catalog::State);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif // CRL_CATALOG_H
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
.. |menu_KiteLoadGlobalRouting| image:: ./images/PR-SBS-LoadGlobal.png
|
.. |menu_KiteLoadGlobalRouting| image:: ./images/PR-SBS-LoadGlobal.png
|
||||||
.. |menu_KiteGlobalRoute| image:: ./images/PR-GlobalRoute.png
|
.. |menu_KiteGlobalRoute| image:: ./images/PR-GlobalRoute.png
|
||||||
.. |menu_KiteDetailedRoute| image:: ./images/PR-DetailedRoute.png
|
.. |menu_KiteDetailedRoute| image:: ./images/PR-DetailedRoute.png
|
||||||
|
.. |menu_KiteDetailedPreRoute| image:: ./images/PR-DetailedPreRoute.png
|
||||||
.. |menu_KiteFinalizeRoute| image:: ./images/PR-FinalizeRoute.png
|
.. |menu_KiteFinalizeRoute| image:: ./images/PR-FinalizeRoute.png
|
||||||
|
|
||||||
.. Stand-alone images.
|
.. Stand-alone images.
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
.. |menu_KiteLoadGlobalRouting| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{L}oad Global Routing}}}}`
|
.. |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_KiteGlobalRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{G}lobal Route}}}}`
|
||||||
.. |menu_KiteDetailedRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{D}etailed 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}}}}`
|
.. |menu_KiteFinalizeRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{F}inalize Route}}}}`
|
||||||
|
|
||||||
.. Stand-alone images.
|
.. Stand-alone images.
|
||||||
|
|
|
@ -886,18 +886,25 @@ which represent one track. The maximum capacity of the |SxLib| gauge is
|
||||||
|
|
||||||
|newpage|
|
|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 pre-route |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteDetailedPreRoute|.
|
||||||
#. Detailed routing |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteDetailedRoute|.
|
#. Global routing |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteGlobalRoute|.
|
||||||
#. Finalize routing |menu_P&R| |rightarrow| |menu_StepByStep| |rightarrow| |menu_KiteFinalizeRoute|.
|
#. 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.
|
It is possible to supply to the router a complete wiring for some nets that the user's
|
||||||
The wiring is thus represented in a way that allows |Kite| to manage it but
|
wants to be routed according to a specific topology. The supplied topology must respect
|
||||||
which is not completly finished. The finalize step performs the removal of
|
the building rules of the |Katabatic| database (contacts must be, terminals, turns, h-tee
|
||||||
the |Kite| data-structure and finish/cleanup the wiring so that its
|
& v-tee only). During the first step :fboxtt:`Detailed Pre-Route` the router will solve
|
||||||
connex in the sense of |Hurricane|. *Do not* try to save
|
overlaps between the segments, without making any dogleg. If no pre-routed topologies
|
||||||
your design before that step, you would get gaps in it.
|
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
|
You may visualize the density (saturation) of either |Knik| (on edges) or
|
||||||
|Kite| (on GCells) until the routing is finalized. Special layers appears
|
|Kite| (on GCells) until the routing is finalized. Special layers appears
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
.. |menu_KiteLoadGlobalRouting| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-sbs-loadglobal.png
|
.. |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_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_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
|
.. |menu_KiteFinalizeRoute| image:: https://soc-extras.lip6.fr/media/filer/2012/12/07/pr-finalizeroute.png
|
||||||
|
|
||||||
.. Stand-alone images.
|
.. Stand-alone images.
|
||||||
|
|
|
@ -3,63 +3,13 @@ Landscape
|
||||||
Center
|
Center
|
||||||
Inches
|
Inches
|
||||||
Letter
|
Letter
|
||||||
100.00
|
70.00
|
||||||
Single
|
Single
|
||||||
-2
|
-2
|
||||||
1200 2
|
1200 2
|
||||||
6 4125 7725 10875 8775
|
2 2 0 4 8 8 60 -1 41 0.000 0 0 -1 0 0 5
|
||||||
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
|
|
||||||
9000 6000 10800 6000 10800 6900 9000 6900 9000 6000
|
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
|
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
|
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
|
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
|
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
|
1 1 2.00 120.00 240.00
|
||||||
5100 600 5100 -300
|
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
|
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
|
1 1 2.00 120.00 240.00
|
||||||
5400 6000 5400 5100
|
5400 6000 5400 5100
|
||||||
2 1 0 2 8 7 70 -1 -1 0.000 0 0 -1 1 0 2
|
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
|
1 1 2.00 120.00 240.00
|
||||||
5550 6000 5550 3300
|
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
|
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
|
1 1 2.00 120.00 240.00
|
||||||
4800 7800 4800 5100
|
4800 7800 4800 5100
|
||||||
2 1 0 2 0 7 70 -1 -1 0.000 0 0 -1 1 0 2
|
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
|
1 1 2.00 120.00 240.00
|
||||||
4650 7800 4650 6900
|
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
|
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
|
1 1 2.00 120.00 240.00
|
||||||
10800 8250 11700 8250
|
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
|
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
|
1 1 2.00 120.00 240.00
|
||||||
12600 2700 13200 2700
|
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
|
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
|
1 1 2.00 120.00 240.00
|
||||||
13500 1800 13500 600
|
13500 1800 13500 600
|
||||||
2 1 0 2 18 5 70 -1 -1 0.000 0 0 -1 1 0 2
|
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
|
1 1 2.00 120.00 240.00
|
||||||
14100 4800 14100 600
|
14100 4800 14100 600
|
||||||
4 1 8 50 -1 2 24 0.0000 4 270 1845 6600 6600 CRL Core\001
|
2 2 0 4 21 21 60 -1 41 0.000 0 0 -1 0 0 5
|
||||||
4 1 7 50 -1 2 18 0.0000 4 270 975 9975 6600 PyCRL\001
|
9000 -1200 10800 -1200 10800 -300 9000 -300 9000 -1200
|
||||||
4 1 18 50 -1 2 32 1.5708 4 465 1650 12375 3150 Python\001
|
2 2 0 4 21 7 60 -1 20 0.000 0 0 -1 0 0 5
|
||||||
4 1 7 50 -1 2 32 1.5708 4 450 690 13650 -300 cgt\001
|
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
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
|
@ -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
|
|
@ -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
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
|
@ -328,11 +328,8 @@ namespace Hurricane {
|
||||||
|
|
||||||
const boost::any& callback = iaction->second;
|
const boost::any& callback = iaction->second;
|
||||||
if (callback.type() == typeid( std::function<void()> )) {
|
if (callback.type() == typeid( std::function<void()> )) {
|
||||||
cerr << "Called function " << qPrintable(path) << endl;
|
|
||||||
ExceptionWidget::catchAllWrapper( boost::any_cast< std::function<void()> >(callback) );
|
ExceptionWidget::catchAllWrapper( boost::any_cast< std::function<void()> >(callback) );
|
||||||
} else if (callback.type() == typeid( QString )) {
|
} else if (callback.type() == typeid( QString )) {
|
||||||
cerr << "Called script " << qPrintable(path) << ":"
|
|
||||||
<< qPrintable(boost::any_cast<QString>(callback)) << endl;
|
|
||||||
runScript( boost::any_cast<QString>(callback) );
|
runScript( boost::any_cast<QString>(callback) );
|
||||||
} else {
|
} else {
|
||||||
cerr << Error("CellViewer::doAction(): For action \"%s\",\n"
|
cerr << Error("CellViewer::doAction(): For action \"%s\",\n"
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
|
|
||||||
// -*- C++ -*-
|
// -*- C++ -*-
|
||||||
//
|
//
|
||||||
// This file is part of the Coriolis Software.
|
// 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 |
|
// | C O R I O L I S |
|
||||||
|
|
|
@ -16,6 +16,7 @@ endif ( CHECK_DETERMINISM )
|
||||||
)
|
)
|
||||||
set ( includes katabatic/Constants.h
|
set ( includes katabatic/Constants.h
|
||||||
katabatic/Observer.h
|
katabatic/Observer.h
|
||||||
|
katabatic/NetRoutingProperty.h
|
||||||
katabatic/Configuration.h
|
katabatic/Configuration.h
|
||||||
katabatic/ChipTools.h
|
katabatic/ChipTools.h
|
||||||
katabatic/AutoContact.h
|
katabatic/AutoContact.h
|
||||||
|
@ -37,6 +38,7 @@ endif ( CHECK_DETERMINISM )
|
||||||
set ( mocIncludes katabatic/GraphicKatabaticEngine.h )
|
set ( mocIncludes katabatic/GraphicKatabaticEngine.h )
|
||||||
set ( cpps Configuration.cpp
|
set ( cpps Configuration.cpp
|
||||||
Observer.cpp
|
Observer.cpp
|
||||||
|
NetRoutingProperty.cpp
|
||||||
ChipTools.cpp
|
ChipTools.cpp
|
||||||
AutoContact.cpp
|
AutoContact.cpp
|
||||||
AutoContactTerminal.cpp
|
AutoContactTerminal.cpp
|
||||||
|
|
|
@ -153,7 +153,9 @@ namespace Katabatic {
|
||||||
, _configuration (new ConfigurationConcrete())
|
, _configuration (new ConfigurationConcrete())
|
||||||
, _gcellGrid (NULL)
|
, _gcellGrid (NULL)
|
||||||
, _chipTools (cell)
|
, _chipTools (cell)
|
||||||
, _routingNets ()
|
, _autoSegmentLut ()
|
||||||
|
, _autoContactLut ()
|
||||||
|
, _netRoutingStates ()
|
||||||
{
|
{
|
||||||
addMeasure<size_t>( cell, "Gates"
|
addMeasure<size_t>( cell, "Gates"
|
||||||
, AllianceFramework::getInstancesCount(cell,AllianceFramework::IgnoreFeeds
|
, AllianceFramework::getInstancesCount(cell,AllianceFramework::IgnoreFeeds
|
||||||
|
@ -459,7 +461,57 @@ namespace Katabatic {
|
||||||
{ return _configuration; }
|
{ return _configuration; }
|
||||||
|
|
||||||
|
|
||||||
void KatabaticEngine::loadGlobalRouting ( unsigned int method, NetSet& nets, const map<Name,Net*>& 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)
|
if (_state < EngineGlobalLoaded)
|
||||||
throw Error ("KatabaticEngine::loadGlobalRouting() : global routing not present yet.");
|
throw Error ("KatabaticEngine::loadGlobalRouting() : global routing not present yet.");
|
||||||
|
@ -467,40 +519,6 @@ namespace Katabatic {
|
||||||
if (_state > EngineGlobalLoaded)
|
if (_state > EngineGlobalLoaded)
|
||||||
throw Error ("KatabaticEngine::loadGlobalRouting() : global routing already loaded.");
|
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 ) {
|
switch ( method ) {
|
||||||
case EngineLoadGrByNet: _loadGrByNet(); break;
|
case EngineLoadGrByNet: _loadGrByNet(); break;
|
||||||
case EngineLoadGrByGCell:
|
case EngineLoadGrByGCell:
|
||||||
|
@ -825,9 +843,9 @@ namespace Katabatic {
|
||||||
record->add( getSlot( "_configuration" , _configuration ) );
|
record->add( getSlot( "_configuration" , _configuration ) );
|
||||||
record->add( getSlot( "_gcellGrid" , _gcellGrid ) );
|
record->add( getSlot( "_gcellGrid" , _gcellGrid ) );
|
||||||
record->add( getSlot( "_chipTools" , _chipTools ) );
|
record->add( getSlot( "_chipTools" , _chipTools ) );
|
||||||
record->add( getSlot( "_routingNets" , &_routingNets ) );
|
|
||||||
record->add( getSlot( "_autoContactLut" , &_autoContactLut ) );
|
record->add( getSlot( "_autoContactLut" , &_autoContactLut ) );
|
||||||
record->add( getSlot( "_autoSegmentLut" , &_autoSegmentLut ) );
|
record->add( getSlot( "_autoSegmentLut" , &_autoSegmentLut ) );
|
||||||
|
record->add( getSlot( "_netRoutingStates", &_netRoutingStates) );
|
||||||
|
|
||||||
return record;
|
return record;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "hurricane/Instance.h"
|
#include "hurricane/Instance.h"
|
||||||
#include "hurricane/Vertical.h"
|
#include "hurricane/Vertical.h"
|
||||||
#include "hurricane/Horizontal.h"
|
#include "hurricane/Horizontal.h"
|
||||||
|
#include "hurricane/Cell.h"
|
||||||
#include "crlcore/RoutingGauge.h"
|
#include "crlcore/RoutingGauge.h"
|
||||||
#include "katabatic/AutoContact.h"
|
#include "katabatic/AutoContact.h"
|
||||||
#include "katabatic/AutoSegment.h"
|
#include "katabatic/AutoSegment.h"
|
||||||
|
@ -131,9 +132,11 @@ namespace Katabatic {
|
||||||
{
|
{
|
||||||
cmess1 << " o Assign Layer (simple wirelength)." << endl;
|
cmess1 << " o Assign Layer (simple wirelength)." << endl;
|
||||||
|
|
||||||
NetSet::iterator inet = _routingNets.begin();
|
forEach ( Net* , inet , getCell()->getNets() ) {
|
||||||
for ( ; inet != _routingNets.end() ; ++inet )
|
if (NetRoutingExtension::get(*inet)->isAutomaticGlobalRoute()) {
|
||||||
_layerAssignByLength ( *inet, total, global, globalNets );
|
_layerAssignByLength ( *inet, total, global, globalNets );
|
||||||
|
}
|
||||||
|
} // forEach(Net*)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -188,9 +191,11 @@ namespace Katabatic {
|
||||||
{
|
{
|
||||||
cmess1 << " o Assign Layer (whole net trunk)." << endl;
|
cmess1 << " o Assign Layer (whole net trunk)." << endl;
|
||||||
|
|
||||||
NetSet::iterator inet = _routingNets.begin();
|
forEach ( Net* , inet , getCell()->getNets() ) {
|
||||||
for ( ; inet != _routingNets.end() ; ++inet )
|
if (NetRoutingExtension::get(*inet)->isAutomaticGlobalRoute()) {
|
||||||
_layerAssignByTrunk( *inet, globalNets, total, global );
|
_layerAssignByTrunk( *inet, globalNets, total, global );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1799,13 +1799,14 @@ namespace Katabatic {
|
||||||
startMeasures();
|
startMeasures();
|
||||||
Session::open( this );
|
Session::open( this );
|
||||||
|
|
||||||
NetSet::iterator inet = _routingNets.begin();
|
forEach ( Net*, inet, getCell()->getNets() ) {
|
||||||
while ( inet != _routingNets.end() ) {
|
if (NetRoutingExtension::isAutomaticGlobalRoute(*inet)) {
|
||||||
DebugSession::open( *inet, 80 );
|
DebugSession::open( *inet, 80 );
|
||||||
_loadNetGlobalRouting( *(inet++) );
|
_loadNetGlobalRouting( *inet );
|
||||||
Session::revalidate();
|
Session::revalidate();
|
||||||
DebugSession::close();
|
DebugSession::close();
|
||||||
}
|
}
|
||||||
|
} // forEach(Net*)
|
||||||
|
|
||||||
#if defined(CHECK_DATABASE)
|
#if defined(CHECK_DATABASE)
|
||||||
_check ( "after Katabatic loading" );
|
_check ( "after Katabatic loading" );
|
||||||
|
@ -1889,7 +1890,8 @@ namespace Katabatic {
|
||||||
cerr << Warning("More than 10 unconnected RoutingPads (%u) on %s, missing global routing?"
|
cerr << Warning("More than 10 unconnected RoutingPads (%u) on %s, missing global routing?"
|
||||||
,unconnecteds, getString(net->getName()).c_str() ) << endl;
|
,unconnecteds, getString(net->getName()).c_str() ) << endl;
|
||||||
|
|
||||||
_routingNets.erase( net );
|
NetRoutingExtension::create( net )->setFlags ( NetRoutingState::Excluded );
|
||||||
|
NetRoutingExtension::create( net )->unsetFlags( NetRoutingState::AutomaticGlobalRoute );
|
||||||
ltraceout(99);
|
ltraceout(99);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ( "<NetRoutingState " + _getString() + " >" );
|
||||||
|
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<NetRoutingProperty*>(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.
|
|
@ -46,6 +46,7 @@ namespace Katabatic {
|
||||||
, KbHalfSlacken = 0x00800000
|
, KbHalfSlacken = 0x00800000
|
||||||
, KbNoGCellShrink = 0x01000000
|
, KbNoGCellShrink = 0x01000000
|
||||||
, KbCParanoid = 0x02000000
|
, KbCParanoid = 0x02000000
|
||||||
|
, KbCreate = 0x04000000
|
||||||
, KbDirectionMask = KbHorizontal|KbVertical
|
, KbDirectionMask = KbHorizontal|KbVertical
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@ namespace CRL {
|
||||||
|
|
||||||
#include "katabatic/Constants.h"
|
#include "katabatic/Constants.h"
|
||||||
#include "katabatic/Configuration.h"
|
#include "katabatic/Configuration.h"
|
||||||
|
#include "katabatic/NetRoutingProperty.h"
|
||||||
#include "katabatic/GCell.h"
|
#include "katabatic/GCell.h"
|
||||||
#include "katabatic/AutoSegments.h"
|
#include "katabatic/AutoSegments.h"
|
||||||
#include "katabatic/AutoContact.h"
|
#include "katabatic/AutoContact.h"
|
||||||
|
@ -84,114 +85,119 @@ namespace Katabatic {
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Class : "KatabaticEngine".
|
// Class : "KatabaticEngine".
|
||||||
|
|
||||||
|
typedef map<Name,NetRoutingState*> NetRoutingStates;
|
||||||
|
|
||||||
class KatabaticEngine : public ToolEngine {
|
class KatabaticEngine : public ToolEngine {
|
||||||
public:
|
public:
|
||||||
typedef set<Net*,NetCompareByName> NetSet;
|
typedef set<Net*,NetCompareByName> NetSet;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Constructor.
|
// Constructor.
|
||||||
static KatabaticEngine* create ( Cell* );
|
static KatabaticEngine* create ( Cell* );
|
||||||
// Accessors.
|
// Accessors.
|
||||||
static KatabaticEngine* get ( const Cell* );
|
static KatabaticEngine* get ( const Cell* );
|
||||||
static const Name& staticGetName ();
|
static const Name& staticGetName ();
|
||||||
inline bool isGMetal ( const Layer* ) const;
|
inline bool isGMetal ( const Layer* ) const;
|
||||||
inline bool isGContact ( const Layer* ) const;
|
inline bool isGContact ( const Layer* ) const;
|
||||||
inline bool isChip () const;
|
inline bool isChip () const;
|
||||||
inline bool isInDemoMode () const;
|
inline bool isInDemoMode () const;
|
||||||
inline bool doWarnOnGCellOverload () const;
|
inline bool doWarnOnGCellOverload () const;
|
||||||
inline bool doDestroyBaseContact () const;
|
inline bool doDestroyBaseContact () const;
|
||||||
inline bool doDestroyBaseSegment () const;
|
inline bool doDestroyBaseSegment () const;
|
||||||
inline bool doDestroyTool () const;
|
inline bool doDestroyTool () const;
|
||||||
virtual const Name& getName () const;
|
virtual const Name& getName () const;
|
||||||
inline EngineState getState () const;
|
inline EngineState getState () const;
|
||||||
inline unsigned int getFlags ( unsigned int mask ) const;
|
inline unsigned int getFlags ( unsigned int mask ) const;
|
||||||
inline Configuration* getKatabaticConfiguration ();
|
inline Configuration* getKatabaticConfiguration ();
|
||||||
virtual Configuration* getConfiguration ();
|
virtual Configuration* getConfiguration ();
|
||||||
inline CellGauge* getCellGauge () const;
|
inline CellGauge* getCellGauge () const;
|
||||||
inline RoutingGauge* getRoutingGauge () const;
|
inline RoutingGauge* getRoutingGauge () const;
|
||||||
inline RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
|
inline RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
|
||||||
inline const Layer* getRoutingLayer ( size_t depth ) const ;
|
inline const Layer* getRoutingLayer ( size_t depth ) const ;
|
||||||
inline Layer* getContactLayer ( size_t depth ) const ;
|
inline Layer* getContactLayer ( size_t depth ) const ;
|
||||||
inline GCellGrid* getGCellGrid () const;
|
inline GCellGrid* getGCellGrid () const;
|
||||||
inline const NetSet& getRoutingNets () const;
|
inline const NetSet& getRoutingNets () const;
|
||||||
inline DbU::Unit getGlobalThreshold () const;
|
inline DbU::Unit getGlobalThreshold () const;
|
||||||
inline float getSaturateRatio () const;
|
inline float getSaturateRatio () const;
|
||||||
inline size_t getSaturateRp () const;
|
inline size_t getSaturateRp () const;
|
||||||
inline DbU::Unit getExtensionCap () const;
|
inline DbU::Unit getExtensionCap () const;
|
||||||
inline const ChipTools& getChipTools () const;
|
inline const ChipTools& getChipTools () const;
|
||||||
void xmlWriteGCellGrid ( ostream& );
|
inline const NetRoutingStates& getNetRoutingStates () const;
|
||||||
void xmlWriteGCellGrid ( const string& );
|
void xmlWriteGCellGrid ( ostream& );
|
||||||
// Modifiers.
|
void xmlWriteGCellGrid ( const string& );
|
||||||
inline void setState ( EngineState state );
|
// Modifiers.
|
||||||
inline void setFlags ( unsigned int );
|
inline void setState ( EngineState state );
|
||||||
inline void unsetFlags ( unsigned int );
|
inline void setFlags ( unsigned int );
|
||||||
inline void setGlobalThreshold ( DbU::Unit );
|
inline void unsetFlags ( unsigned int );
|
||||||
inline void setSaturateRatio ( float );
|
inline void setGlobalThreshold ( DbU::Unit );
|
||||||
inline void setSaturateRp ( size_t );
|
inline void setSaturateRatio ( float );
|
||||||
void startMeasures ();
|
inline void setSaturateRp ( size_t );
|
||||||
void stopMeasures ();
|
void startMeasures ();
|
||||||
void printMeasures ( const string& ) const;
|
void stopMeasures ();
|
||||||
void refresh ( unsigned int flags=KbOpenSession );
|
void printMeasures ( const string& ) const;
|
||||||
virtual void createDetailedGrid ();
|
void refresh ( unsigned int flags=KbOpenSession );
|
||||||
void chipPrep ();
|
virtual void createDetailedGrid ();
|
||||||
void makePowerRails ();
|
void chipPrep ();
|
||||||
virtual void loadGlobalRouting ( unsigned int method, NetSet&, const std::map<Name,Net*>& );
|
void findSpecialNets ();
|
||||||
void slackenBorder ( Box bb, Layer::Mask, unsigned int flags );
|
void makePowerRails ();
|
||||||
void slackenBlockIos ( Instance* core );
|
virtual void loadGlobalRouting ( unsigned int method );
|
||||||
bool moveUpNetTrunk ( AutoSegment*, set<Net*>& globalNets, GCell::SetIndex& invalidateds );
|
void slackenBorder ( Box bb, Layer::Mask, unsigned int flags );
|
||||||
void moveULeft ( AutoSegment*, set<Net*>& globalNets, GCell::SetIndex& invalidateds );
|
void slackenBlockIos ( Instance* core );
|
||||||
void moveURight ( AutoSegment*, set<Net*>& globalNets, GCell::SetIndex& invalidateds );
|
bool moveUpNetTrunk ( AutoSegment*, set<Net*>& globalNets, GCell::SetIndex& invalidateds );
|
||||||
void balanceGlobalDensity ();
|
void moveULeft ( AutoSegment*, set<Net*>& globalNets, GCell::SetIndex& invalidateds );
|
||||||
void layerAssign ( unsigned int method );
|
void moveURight ( AutoSegment*, set<Net*>& globalNets, GCell::SetIndex& invalidateds );
|
||||||
void updateNetTopology ( Net* );
|
void balanceGlobalDensity ();
|
||||||
void computeNetConstraints ( Net* );
|
void layerAssign ( unsigned int method );
|
||||||
void toOptimals ( Net* );
|
void updateNetTopology ( Net* );
|
||||||
virtual void finalizeLayout ();
|
void computeNetConstraints ( Net* );
|
||||||
// Internal Modifiers.
|
void toOptimals ( Net* );
|
||||||
void _computeNetOptimals ( Net* );
|
virtual void finalizeLayout ();
|
||||||
void _computeNetTerminals ( Net* );
|
// Internal Modifiers.
|
||||||
bool _check ( const char* message=NULL ) const;
|
NetRoutingState* getRoutingState ( Net*, unsigned int flags=KbNoFlags );
|
||||||
void _check ( Net* ) const;
|
void _computeNetOptimals ( Net* );
|
||||||
void _gutKatabatic ();
|
void _computeNetTerminals ( Net* );
|
||||||
void _link ( AutoContact* );
|
bool _check ( const char* message=NULL ) const;
|
||||||
void _link ( AutoSegment* );
|
void _check ( Net* ) const;
|
||||||
void _unlink ( AutoContact* );
|
void _gutKatabatic ();
|
||||||
void _unlink ( AutoSegment* );
|
void _link ( AutoContact* );
|
||||||
AutoContact* _lookup ( Contact* ) const;
|
void _link ( AutoSegment* );
|
||||||
AutoSegment* _lookup ( Segment* ) const;
|
void _unlink ( AutoContact* );
|
||||||
void _destroyAutoSegments ();
|
void _unlink ( AutoSegment* );
|
||||||
void _destroyAutoContacts ();
|
AutoContact* _lookup ( Contact* ) const;
|
||||||
void _loadGrByNet ();
|
AutoSegment* _lookup ( Segment* ) const;
|
||||||
void _loadNetGlobalRouting ( Net* );
|
void _destroyAutoSegments ();
|
||||||
void _alignate ( Net* );
|
void _destroyAutoContacts ();
|
||||||
void _balanceGlobalDensity ( unsigned int depth );
|
void _loadGrByNet ();
|
||||||
void _desaturate ( unsigned int depth, set<Net*>&, unsigned long& total, unsigned long& globals );
|
void _loadNetGlobalRouting ( Net* );
|
||||||
void _layerAssignByLength ( unsigned long& total, unsigned long& global, set<Net*>& );
|
void _alignate ( Net* );
|
||||||
void _layerAssignByLength ( Net*, unsigned long& total, unsigned long& global, set<Net*>& );
|
void _balanceGlobalDensity ( unsigned int depth );
|
||||||
void _layerAssignByTrunk ( unsigned long& total, unsigned long& global, set<Net*>& );
|
void _desaturate ( unsigned int depth, set<Net*>&, unsigned long& total, unsigned long& globals );
|
||||||
void _layerAssignByTrunk ( Net*, set<Net*>&, unsigned long& total, unsigned long& global );
|
void _layerAssignByLength ( unsigned long& total, unsigned long& global, set<Net*>& );
|
||||||
void _saveNet ( Net* );
|
void _layerAssignByLength ( Net*, unsigned long& total, unsigned long& global, set<Net*>& );
|
||||||
void _print () const;
|
void _layerAssignByTrunk ( unsigned long& total, unsigned long& global, set<Net*>& );
|
||||||
void _print ( Net* ) const;
|
void _layerAssignByTrunk ( Net*, set<Net*>&, unsigned long& total, unsigned long& global );
|
||||||
inline const AutoContactLut& _getAutoContactLut () const;
|
void _saveNet ( Net* );
|
||||||
inline const AutoSegmentLut& _getAutoSegmentLut () const;
|
void _print () const;
|
||||||
// Inspector Management.
|
void _print ( Net* ) const;
|
||||||
virtual Record* _getRecord () const;
|
inline const AutoContactLut& _getAutoContactLut () const;
|
||||||
virtual string _getString () const;
|
inline const AutoSegmentLut& _getAutoSegmentLut () const;
|
||||||
virtual string _getTypeName () const;
|
// Inspector Management.
|
||||||
|
virtual Record* _getRecord () const;
|
||||||
|
virtual string _getString () const;
|
||||||
|
virtual string _getTypeName () const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Attributes.
|
// Attributes.
|
||||||
static Name _toolName;
|
static Name _toolName;
|
||||||
Timer _timer;
|
Timer _timer;
|
||||||
EngineState _state;
|
EngineState _state;
|
||||||
unsigned int _flags;
|
unsigned int _flags;
|
||||||
Configuration* _configuration;
|
Configuration* _configuration;
|
||||||
GCellGrid* _gcellGrid;
|
GCellGrid* _gcellGrid;
|
||||||
ChipTools _chipTools;
|
ChipTools _chipTools;
|
||||||
NetSet _routingNets;
|
AutoSegmentLut _autoSegmentLut;
|
||||||
AutoSegmentLut _autoSegmentLut;
|
AutoContactLut _autoContactLut;
|
||||||
AutoContactLut _autoContactLut;
|
NetRoutingStates _netRoutingStates;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Constructors & Destructors.
|
// Constructors & Destructors.
|
||||||
|
@ -227,7 +233,6 @@ namespace Katabatic {
|
||||||
inline const Layer* KatabaticEngine::getRoutingLayer ( size_t depth ) const { return _configuration->getRoutingLayer(depth); }
|
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 Layer* KatabaticEngine::getContactLayer ( size_t depth ) const { return _configuration->getContactLayer(depth); }
|
||||||
inline GCellGrid* KatabaticEngine::getGCellGrid () const { return _gcellGrid; }
|
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 DbU::Unit KatabaticEngine::getGlobalThreshold () const { return _configuration->getGlobalThreshold(); }
|
||||||
inline float KatabaticEngine::getSaturateRatio () const { return _configuration->getSaturateRatio(); }
|
inline float KatabaticEngine::getSaturateRatio () const { return _configuration->getSaturateRatio(); }
|
||||||
inline size_t KatabaticEngine::getSaturateRp () const { return _configuration->getSaturateRp(); }
|
inline size_t KatabaticEngine::getSaturateRp () const { return _configuration->getSaturateRp(); }
|
||||||
|
@ -236,6 +241,7 @@ namespace Katabatic {
|
||||||
inline void KatabaticEngine::setState ( EngineState state ) { _state = state; }
|
inline void KatabaticEngine::setState ( EngineState state ) { _state = state; }
|
||||||
inline bool KatabaticEngine::isChip () const { return _chipTools.isChip(); }
|
inline bool KatabaticEngine::isChip () const { return _chipTools.isChip(); }
|
||||||
inline const ChipTools& KatabaticEngine::getChipTools () const { return _chipTools; }
|
inline const ChipTools& KatabaticEngine::getChipTools () const { return _chipTools; }
|
||||||
|
inline const NetRoutingStates& KatabaticEngine::getNetRoutingStates () const { return _netRoutingStates; }
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
|
|
@ -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 <string>
|
||||||
|
#include <map>
|
||||||
|
#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
|
|
@ -31,6 +31,7 @@
|
||||||
#include "hurricane/Path.h"
|
#include "hurricane/Path.h"
|
||||||
#include "hurricane/Query.h"
|
#include "hurricane/Query.h"
|
||||||
#include "crlcore/AllianceFramework.h"
|
#include "crlcore/AllianceFramework.h"
|
||||||
|
#include "katabatic/NetRoutingProperty.h"
|
||||||
#include "kite/RoutingPlane.h"
|
#include "kite/RoutingPlane.h"
|
||||||
#include "kite/TrackFixedSegment.h"
|
#include "kite/TrackFixedSegment.h"
|
||||||
#include "kite/Track.h"
|
#include "kite/Track.h"
|
||||||
|
@ -68,6 +69,7 @@ namespace {
|
||||||
using Hurricane::DataBase;
|
using Hurricane::DataBase;
|
||||||
using CRL::AllianceFramework;
|
using CRL::AllianceFramework;
|
||||||
using Katabatic::ChipTools;
|
using Katabatic::ChipTools;
|
||||||
|
using Katabatic::NetRoutingExtension;
|
||||||
using namespace Kite;
|
using namespace Kite;
|
||||||
|
|
||||||
|
|
||||||
|
@ -236,10 +238,8 @@ namespace {
|
||||||
_vssiName = "";
|
_vssiName = "";
|
||||||
_ckoName = "";
|
_ckoName = "";
|
||||||
|
|
||||||
map<Name,Net*> preRouteds = kite->getPreRouteds();
|
|
||||||
|
|
||||||
forEach ( Net*, inet, topCell->getNets() ) {
|
forEach ( Net*, inet, topCell->getNets() ) {
|
||||||
if (preRouteds.find(inet->getName()) != preRouteds.end()) continue;
|
if (NetRoutingExtension::isManualGlobalRoute(*inet)) continue;
|
||||||
|
|
||||||
Net::Type netType = inet->getType();
|
Net::Type netType = inet->getType();
|
||||||
if (netType == Net::Type::POWER) {
|
if (netType == Net::Type::POWER) {
|
||||||
|
@ -1161,6 +1161,7 @@ namespace Kite {
|
||||||
using Hurricane::Technology;
|
using Hurricane::Technology;
|
||||||
using Hurricane::BasicLayer;
|
using Hurricane::BasicLayer;
|
||||||
using Hurricane::ForEachIterator;
|
using Hurricane::ForEachIterator;
|
||||||
|
using Katabatic::NetRoutingState;
|
||||||
|
|
||||||
|
|
||||||
void KiteEngine::buildPowerRails ()
|
void KiteEngine::buildPowerRails ()
|
||||||
|
@ -1169,6 +1170,9 @@ namespace Kite {
|
||||||
_blockageNet = getCell()->getNet("blockagenet");
|
_blockageNet = getCell()->getNet("blockagenet");
|
||||||
if (not _blockageNet)
|
if (not _blockageNet)
|
||||||
_blockageNet = Net::create( getCell(), "blockagenet" );
|
_blockageNet = Net::create( getCell(), "blockagenet" );
|
||||||
|
|
||||||
|
NetRoutingState* state = getRoutingState( _blockageNet, Katabatic::KbCreate );
|
||||||
|
state->setFlags( NetRoutingState::Fixed );
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryPowerRails query ( this );
|
QueryPowerRails query ( this );
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "hurricane/Path.h"
|
#include "hurricane/Path.h"
|
||||||
#include "hurricane/Query.h"
|
#include "hurricane/Query.h"
|
||||||
#include "crlcore/AllianceFramework.h"
|
#include "crlcore/AllianceFramework.h"
|
||||||
|
#include "katabatic/NetRoutingProperty.h"
|
||||||
#include "katabatic/AutoContact.h"
|
#include "katabatic/AutoContact.h"
|
||||||
#include "kite/RoutingPlane.h"
|
#include "kite/RoutingPlane.h"
|
||||||
#include "kite/TrackFixedSegment.h"
|
#include "kite/TrackFixedSegment.h"
|
||||||
|
@ -40,6 +41,12 @@
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
|
||||||
|
} // Anonymous namespace.
|
||||||
|
|
||||||
|
|
||||||
|
namespace Kite {
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using Hurricane::tab;
|
using Hurricane::tab;
|
||||||
using Hurricane::inltrace;
|
using Hurricane::inltrace;
|
||||||
|
@ -68,22 +75,12 @@ namespace {
|
||||||
using Hurricane::Technology;
|
using Hurricane::Technology;
|
||||||
using Hurricane::DataBase;
|
using Hurricane::DataBase;
|
||||||
using CRL::AllianceFramework;
|
using CRL::AllianceFramework;
|
||||||
|
using Hurricane::ForEachIterator;
|
||||||
|
using Katabatic::NetRoutingExtension;
|
||||||
|
using Katabatic::NetRoutingState;
|
||||||
using Katabatic::AutoContact;
|
using Katabatic::AutoContact;
|
||||||
using Katabatic::AutoSegment;
|
using Katabatic::AutoSegment;
|
||||||
using Katabatic::ChipTools;
|
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 ()
|
void KiteEngine::buildPreRouteds ()
|
||||||
|
@ -131,7 +128,9 @@ namespace Kite {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPreRouted or (rpCount < 2)) {
|
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) {
|
if (rpCount > 1) {
|
||||||
for ( auto icontact : contacts ) {
|
for ( auto icontact : contacts ) {
|
||||||
|
@ -148,7 +147,7 @@ namespace Kite {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Session::revalidate ();
|
Session::revalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -173,13 +173,11 @@ namespace Kite {
|
||||||
|
|
||||||
void GraphicKiteEngine::_loadGlobalRouting ()
|
void GraphicKiteEngine::_loadGlobalRouting ()
|
||||||
{
|
{
|
||||||
static KatabaticEngine::NetSet routingNets;
|
|
||||||
|
|
||||||
KiteEngine* kite = getForFramework( NoFlags );
|
KiteEngine* kite = getForFramework( NoFlags );
|
||||||
if (cmess1.enabled()) kite->printConfiguration();
|
if (cmess1.enabled()) kite->printConfiguration();
|
||||||
|
|
||||||
_viewer->clearToolInterrupt();
|
_viewer->clearToolInterrupt();
|
||||||
kite->loadGlobalRouting( Katabatic::EngineLoadGrByNet, routingNets );
|
kite->loadGlobalRouting( Katabatic::EngineLoadGrByNet );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,7 @@ namespace Kite {
|
||||||
using std::ostringstream;
|
using std::ostringstream;
|
||||||
using std::setprecision;
|
using std::setprecision;
|
||||||
using std::vector;
|
using std::vector;
|
||||||
|
using std::make_pair;
|
||||||
using Hurricane::DebugSession;
|
using Hurricane::DebugSession;
|
||||||
using Hurricane::tab;
|
using Hurricane::tab;
|
||||||
using Hurricane::inltrace;
|
using Hurricane::inltrace;
|
||||||
|
@ -100,16 +101,15 @@ namespace Kite {
|
||||||
|
|
||||||
|
|
||||||
KiteEngine::KiteEngine ( Cell* cell )
|
KiteEngine::KiteEngine ( Cell* cell )
|
||||||
: KatabaticEngine (cell)
|
: KatabaticEngine (cell)
|
||||||
, _viewer (NULL)
|
, _viewer (NULL)
|
||||||
, _knik (NULL)
|
, _knik (NULL)
|
||||||
, _blockageNet (NULL)
|
, _blockageNet (NULL)
|
||||||
, _configuration (new Configuration(getKatabaticConfiguration()))
|
, _configuration (new Configuration(getKatabaticConfiguration()))
|
||||||
, _preRouteds ()
|
, _routingPlanes ()
|
||||||
, _routingPlanes ()
|
, _negociateWindow (NULL)
|
||||||
, _negociateWindow(NULL)
|
, _minimumWL (0.0)
|
||||||
, _minimumWL (0.0)
|
, _toolSuccess (false)
|
||||||
, _toolSuccess (false)
|
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
@ -127,6 +127,7 @@ namespace Kite {
|
||||||
Session::open( this );
|
Session::open( this );
|
||||||
createGlobalGraph( KtNoFlags );
|
createGlobalGraph( KtNoFlags );
|
||||||
createDetailedGrid();
|
createDetailedGrid();
|
||||||
|
findSpecialNets();
|
||||||
buildPreRouteds();
|
buildPreRouteds();
|
||||||
buildPowerRails();
|
buildPowerRails();
|
||||||
protectRoutingPads();
|
protectRoutingPads();
|
||||||
|
@ -540,7 +541,12 @@ namespace Kite {
|
||||||
_knik->loadSolution();
|
_knik->loadSolution();
|
||||||
} else {
|
} else {
|
||||||
annotateGlobalGraph();
|
annotateGlobalGraph();
|
||||||
_knik->run( getPreRouteds() );
|
map<Name,Net*> preRouteds;
|
||||||
|
for ( auto istate : getNetRoutingStates() ) {
|
||||||
|
if (istate.second->isMixedPreRoute())
|
||||||
|
preRouteds.insert( make_pair(istate.first, istate.second->getNet()) );
|
||||||
|
}
|
||||||
|
_knik->run( preRouteds );
|
||||||
}
|
}
|
||||||
|
|
||||||
setState( Katabatic::EngineGlobalLoaded );
|
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 );
|
Session::open( this );
|
||||||
getGCellGrid()->checkEdgeOverflow( getHTracksReservedLocal(), getVTracksReservedLocal() );
|
getGCellGrid()->checkEdgeOverflow( getHTracksReservedLocal(), getVTracksReservedLocal() );
|
||||||
|
|
|
@ -142,7 +142,6 @@ int main ( int argc, char *argv[] )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KatabaticEngine::NetSet routingNets;
|
|
||||||
unsigned int globalFlags = (loadGlobal) ? Kite::KtLoadGlobalRouting
|
unsigned int globalFlags = (loadGlobal) ? Kite::KtLoadGlobalRouting
|
||||||
: Kite::KtBuildGlobalRouting;
|
: Kite::KtBuildGlobalRouting;
|
||||||
|
|
||||||
|
@ -152,7 +151,7 @@ int main ( int argc, char *argv[] )
|
||||||
kite->runGlobalRouter( globalFlags );
|
kite->runGlobalRouter( globalFlags );
|
||||||
if (saveGlobal) kite->saveGlobalSolution ();
|
if (saveGlobal) kite->saveGlobalSolution ();
|
||||||
|
|
||||||
kite->loadGlobalRouting ( Katabatic::EngineLoadGrByNet, routingNets );
|
kite->loadGlobalRouting ( Katabatic::EngineLoadGrByNet );
|
||||||
kite->balanceGlobalDensity();
|
kite->balanceGlobalDensity();
|
||||||
kite->layerAssign ( Katabatic::EngineNoNetLayerAssign );
|
kite->layerAssign ( Katabatic::EngineNoNetLayerAssign );
|
||||||
kite->runNegociate ();
|
kite->runNegociate ();
|
||||||
|
|
|
@ -177,9 +177,9 @@ extern "C" {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kite->getViewer()) {
|
if (kite->getViewer()) {
|
||||||
ExceptionWidget::catchAllWrapper( std::bind(&KiteEngine::loadGlobalRouting,kite,flags,*routingNets) );
|
ExceptionWidget::catchAllWrapper( std::bind(&KiteEngine::loadGlobalRouting,kite,flags/*,*routingNets*/) );
|
||||||
} else {
|
} else {
|
||||||
kite->loadGlobalRouting(flags,*routingNets);
|
kite->loadGlobalRouting(flags/*,*routingNets*/);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PyErr_SetString(ConstructorError, "KiteEngine.loadGlobalRouting(): Invalid number/bad type of parameter.");
|
PyErr_SetString(ConstructorError, "KiteEngine.loadGlobalRouting(): Invalid number/bad type of parameter.");
|
||||||
|
|
|
@ -60,80 +60,78 @@ namespace Kite {
|
||||||
class KiteEngine : public KatabaticEngine {
|
class KiteEngine : public KatabaticEngine {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const Name& staticGetName ();
|
static const Name& staticGetName ();
|
||||||
static KiteEngine* create ( Cell* );
|
static KiteEngine* create ( Cell* );
|
||||||
static KiteEngine* get ( const Cell* );
|
static KiteEngine* get ( const Cell* );
|
||||||
public:
|
public:
|
||||||
inline CellViewer* getViewer () const;
|
inline CellViewer* getViewer () const;
|
||||||
inline KatabaticEngine* base ();
|
inline KatabaticEngine* base ();
|
||||||
inline Configuration* getKiteConfiguration ();
|
inline Configuration* getKiteConfiguration ();
|
||||||
virtual Configuration* getConfiguration ();
|
virtual Configuration* getConfiguration ();
|
||||||
inline const map<Name,Net*>& getPreRouteds () const;
|
inline Net* getBlockageNet ();
|
||||||
inline Net* getBlockageNet ();
|
inline bool getToolSuccess () const;
|
||||||
inline bool getToolSuccess () const;
|
inline unsigned long getEventsLimit () const;
|
||||||
inline unsigned long getEventsLimit () const;
|
inline unsigned int getRipupLimit ( unsigned int type ) const;
|
||||||
inline unsigned int getRipupLimit ( unsigned int type ) const;
|
unsigned int getRipupLimit ( const TrackElement* ) const;
|
||||||
unsigned int getRipupLimit ( const TrackElement* ) const;
|
inline unsigned int getRipupCost () const;
|
||||||
inline unsigned int getRipupCost () const;
|
inline size_t getHTracksReservedLocal () const;
|
||||||
inline size_t getHTracksReservedLocal () const;
|
inline size_t getVTracksReservedLocal () const;
|
||||||
inline size_t getVTracksReservedLocal () const;
|
virtual const Name& getName () const;
|
||||||
virtual const Name& getName () const;
|
|
||||||
inline Configuration::PostEventCb_t&
|
inline Configuration::PostEventCb_t&
|
||||||
getPostEventCb ();
|
getPostEventCb ();
|
||||||
inline NegociateWindow* getNegociateWindow ();
|
inline NegociateWindow* getNegociateWindow ();
|
||||||
inline size_t getRoutingPlanesSize () const;
|
inline size_t getRoutingPlanesSize () const;
|
||||||
RoutingPlane* getRoutingPlaneByIndex ( size_t index ) const;
|
RoutingPlane* getRoutingPlaneByIndex ( size_t index ) const;
|
||||||
RoutingPlane* getRoutingPlaneByLayer ( const Layer* ) const;
|
RoutingPlane* getRoutingPlaneByLayer ( const Layer* ) const;
|
||||||
Track* getTrackByPosition ( const Layer*, DbU::Unit axis, unsigned int mode=Constant::Nearest ) const;
|
Track* getTrackByPosition ( const Layer*, DbU::Unit axis, unsigned int mode=Constant::Nearest ) const;
|
||||||
inline void printConfiguration () const;
|
inline void printConfiguration () const;
|
||||||
void printCompletion () const;
|
void printCompletion () const;
|
||||||
void dumpMeasures ( std::ostream& ) const;
|
void dumpMeasures ( std::ostream& ) const;
|
||||||
void dumpMeasures () const;
|
void dumpMeasures () const;
|
||||||
inline void setViewer ( CellViewer* );
|
inline void setViewer ( CellViewer* );
|
||||||
inline void setPostEventCb ( Configuration::PostEventCb_t );
|
inline void setPostEventCb ( Configuration::PostEventCb_t );
|
||||||
inline void setEventLimit ( unsigned long );
|
inline void setEventLimit ( unsigned long );
|
||||||
inline void setMinimumWL ( double );
|
inline void setMinimumWL ( double );
|
||||||
inline void setRipupLimit ( unsigned int type, unsigned int );
|
inline void setRipupLimit ( unsigned int type, unsigned int );
|
||||||
inline void setRipupCost ( unsigned int );
|
inline void setRipupCost ( unsigned int );
|
||||||
inline void setHTracksReservedLocal ( size_t );
|
inline void setHTracksReservedLocal ( size_t );
|
||||||
inline void setVTracksReservedLocal ( size_t );
|
inline void setVTracksReservedLocal ( size_t );
|
||||||
void buildPowerRails ();
|
void buildPowerRails ();
|
||||||
void buildPreRouteds ();
|
void buildPreRouteds ();
|
||||||
void protectRoutingPads ();
|
void protectRoutingPads ();
|
||||||
void preProcess ();
|
void preProcess ();
|
||||||
void setInterrupt ( bool );
|
void setInterrupt ( bool );
|
||||||
void createGlobalGraph ( unsigned int mode );
|
void createGlobalGraph ( unsigned int mode );
|
||||||
virtual void createDetailedGrid ();
|
virtual void createDetailedGrid ();
|
||||||
void saveGlobalSolution ();
|
void saveGlobalSolution ();
|
||||||
void annotateGlobalGraph ();
|
void annotateGlobalGraph ();
|
||||||
void setFixedPreRouted ();
|
void setFixedPreRouted ();
|
||||||
void runNegociate ( unsigned int flags=KtNoFlags );
|
void runNegociate ( unsigned int flags=KtNoFlags );
|
||||||
void runGlobalRouter ( unsigned int mode );
|
void runGlobalRouter ( unsigned int mode );
|
||||||
virtual void loadGlobalRouting ( unsigned int method, KatabaticEngine::NetSet& );
|
virtual void loadGlobalRouting ( unsigned int method );
|
||||||
virtual void finalizeLayout ();
|
virtual void finalizeLayout ();
|
||||||
void _gutKite ();
|
void _gutKite ();
|
||||||
void _computeCagedConstraints ();
|
void _computeCagedConstraints ();
|
||||||
TrackElement* _lookup ( Segment* ) const;
|
TrackElement* _lookup ( Segment* ) const;
|
||||||
inline TrackElement* _lookup ( AutoSegment* ) const;
|
inline TrackElement* _lookup ( AutoSegment* ) const;
|
||||||
bool _check ( unsigned int& overlap, const char* message=NULL ) const;
|
bool _check ( unsigned int& overlap, const char* message=NULL ) const;
|
||||||
void _check ( Net* ) const;
|
void _check ( Net* ) const;
|
||||||
virtual Record* _getRecord () const;
|
virtual Record* _getRecord () const;
|
||||||
virtual string _getString () const;
|
virtual string _getString () const;
|
||||||
virtual string _getTypeName () const;
|
virtual string _getTypeName () const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Attributes.
|
// Attributes.
|
||||||
static Name _toolName;
|
static Name _toolName;
|
||||||
protected:
|
protected:
|
||||||
CellViewer* _viewer;
|
CellViewer* _viewer;
|
||||||
Knik::KnikEngine* _knik;
|
Knik::KnikEngine* _knik;
|
||||||
Net* _blockageNet;
|
Net* _blockageNet;
|
||||||
Configuration* _configuration;
|
Configuration* _configuration;
|
||||||
map<Name,Net*> _preRouteds;
|
vector<RoutingPlane*> _routingPlanes;
|
||||||
vector<RoutingPlane*> _routingPlanes;
|
NegociateWindow* _negociateWindow;
|
||||||
NegociateWindow* _negociateWindow;
|
double _minimumWL;
|
||||||
double _minimumWL;
|
mutable bool _toolSuccess;
|
||||||
mutable bool _toolSuccess;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Constructors & Destructors.
|
// Constructors & Destructors.
|
||||||
|
@ -153,7 +151,6 @@ namespace Kite {
|
||||||
inline KatabaticEngine* KiteEngine::base () { return static_cast<KatabaticEngine*>(this); }
|
inline KatabaticEngine* KiteEngine::base () { return static_cast<KatabaticEngine*>(this); }
|
||||||
inline Configuration* KiteEngine::getKiteConfiguration () { return _configuration; }
|
inline Configuration* KiteEngine::getKiteConfiguration () { return _configuration; }
|
||||||
inline Net* KiteEngine::getBlockageNet () { return _blockageNet; }
|
inline Net* KiteEngine::getBlockageNet () { return _blockageNet; }
|
||||||
inline const map<Name,Net*>& KiteEngine::getPreRouteds () const { return _preRouteds; }
|
|
||||||
inline Configuration::PostEventCb_t& KiteEngine::getPostEventCb () { return _configuration->getPostEventCb(); }
|
inline Configuration::PostEventCb_t& KiteEngine::getPostEventCb () { return _configuration->getPostEventCb(); }
|
||||||
inline bool KiteEngine::getToolSuccess () const { return _toolSuccess; }
|
inline bool KiteEngine::getToolSuccess () const { return _toolSuccess; }
|
||||||
inline unsigned long KiteEngine::getEventsLimit () const { return _configuration->getEventsLimit(); }
|
inline unsigned long KiteEngine::getEventsLimit () const { return _configuration->getEventsLimit(); }
|
||||||
|
|
|
@ -400,7 +400,6 @@ int main ( int argc, char *argv[] )
|
||||||
unsigned int globalFlags = (loadGlobal) ? Kite::KtLoadGlobalRouting
|
unsigned int globalFlags = (loadGlobal) ? Kite::KtLoadGlobalRouting
|
||||||
: Kite::KtBuildGlobalRouting;
|
: Kite::KtBuildGlobalRouting;
|
||||||
|
|
||||||
static KatabaticEngine::NetSet routingNets;
|
|
||||||
KiteEngine* kite = KiteEngine::create ( cell );
|
KiteEngine* kite = KiteEngine::create ( cell );
|
||||||
if ( showConf ) kite->printConfiguration ();
|
if ( showConf ) kite->printConfiguration ();
|
||||||
|
|
||||||
|
@ -408,7 +407,7 @@ int main ( int argc, char *argv[] )
|
||||||
if ( saveGlobal ) kite->saveGlobalSolution ();
|
if ( saveGlobal ) kite->saveGlobalSolution ();
|
||||||
|
|
||||||
if ( detailedRoute ) {
|
if ( detailedRoute ) {
|
||||||
kite->loadGlobalRouting ( Katabatic::EngineLoadGrByNet, routingNets );
|
kite->loadGlobalRouting ( Katabatic::EngineLoadGrByNet );
|
||||||
kite->layerAssign ( Katabatic::EngineNoNetLayerAssign );
|
kite->layerAssign ( Katabatic::EngineNoNetLayerAssign );
|
||||||
kite->runNegociate ();
|
kite->runNegociate ();
|
||||||
kiteSuccess = kite->getToolSuccess ();
|
kiteSuccess = kite->getToolSuccess ();
|
||||||
|
|
Loading…
Reference in New Issue