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++ -*-
|
||||
//
|
||||
// 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 <iomanip>
|
||||
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"
|
||||
|
||||
|
|
|
@ -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 <string>
|
||||
#include <map>
|
||||
|
||||
#include "hurricane/Name.h"
|
||||
#include "hurricane/Property.h"
|
||||
#include "hurricane/Slot.h"
|
||||
#include <string>
|
||||
#include <map>
|
||||
#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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
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;
|
||||
if (callback.type() == typeid( std::function<void()> )) {
|
||||
cerr << "Called function " << qPrintable(path) << endl;
|
||||
ExceptionWidget::catchAllWrapper( boost::any_cast< std::function<void()> >(callback) );
|
||||
} else if (callback.type() == typeid( QString )) {
|
||||
cerr << "Called script " << qPrintable(path) << ":"
|
||||
<< qPrintable(boost::any_cast<QString>(callback)) << endl;
|
||||
runScript( boost::any_cast<QString>(callback) );
|
||||
} else {
|
||||
cerr << Error("CellViewer::doAction(): For action \"%s\",\n"
|
||||
|
|
|
@ -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 |
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -153,7 +153,9 @@ namespace Katabatic {
|
|||
, _configuration (new ConfigurationConcrete())
|
||||
, _gcellGrid (NULL)
|
||||
, _chipTools (cell)
|
||||
, _routingNets ()
|
||||
, _autoSegmentLut ()
|
||||
, _autoContactLut ()
|
||||
, _netRoutingStates ()
|
||||
{
|
||||
addMeasure<size_t>( 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<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)
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
, KbNoGCellShrink = 0x01000000
|
||||
, KbCParanoid = 0x02000000
|
||||
, KbCreate = 0x04000000
|
||||
, KbDirectionMask = KbHorizontal|KbVertical
|
||||
};
|
||||
|
||||
|
|
|
@ -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<Name,NetRoutingState*> NetRoutingStates;
|
||||
|
||||
class KatabaticEngine : public ToolEngine {
|
||||
public:
|
||||
typedef set<Net*,NetCompareByName> 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<Name,Net*>& );
|
||||
void slackenBorder ( Box bb, Layer::Mask, unsigned int flags );
|
||||
void slackenBlockIos ( Instance* core );
|
||||
bool moveUpNetTrunk ( AutoSegment*, set<Net*>& globalNets, GCell::SetIndex& invalidateds );
|
||||
void moveULeft ( AutoSegment*, set<Net*>& globalNets, GCell::SetIndex& invalidateds );
|
||||
void moveURight ( AutoSegment*, set<Net*>& 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<Net*>&, unsigned long& total, unsigned long& globals );
|
||||
void _layerAssignByLength ( unsigned long& total, unsigned long& global, set<Net*>& );
|
||||
void _layerAssignByLength ( Net*, unsigned long& total, unsigned long& global, set<Net*>& );
|
||||
void _layerAssignByTrunk ( unsigned long& total, unsigned long& global, set<Net*>& );
|
||||
void _layerAssignByTrunk ( Net*, set<Net*>&, 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<Net*>& globalNets, GCell::SetIndex& invalidateds );
|
||||
void moveULeft ( AutoSegment*, set<Net*>& globalNets, GCell::SetIndex& invalidateds );
|
||||
void moveURight ( AutoSegment*, set<Net*>& 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<Net*>&, unsigned long& total, unsigned long& globals );
|
||||
void _layerAssignByLength ( unsigned long& total, unsigned long& global, set<Net*>& );
|
||||
void _layerAssignByLength ( Net*, unsigned long& total, unsigned long& global, set<Net*>& );
|
||||
void _layerAssignByTrunk ( unsigned long& total, unsigned long& global, set<Net*>& );
|
||||
void _layerAssignByTrunk ( Net*, set<Net*>&, 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; }
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
|
|
|
@ -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/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<Name,Net*> 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 );
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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<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 );
|
||||
|
@ -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() );
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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.");
|
||||
|
|
|
@ -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<Name,Net*>& 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<Name,Net*> _preRouteds;
|
||||
vector<RoutingPlane*> _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<RoutingPlane*> _routingPlanes;
|
||||
NegociateWindow* _negociateWindow;
|
||||
double _minimumWL;
|
||||
mutable bool _toolSuccess;
|
||||
|
||||
protected:
|
||||
// Constructors & Destructors.
|
||||
|
@ -153,7 +151,6 @@ namespace Kite {
|
|||
inline KatabaticEngine* KiteEngine::base () { return static_cast<KatabaticEngine*>(this); }
|
||||
inline Configuration* KiteEngine::getKiteConfiguration () { return _configuration; }
|
||||
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 bool KiteEngine::getToolSuccess () const { return _toolSuccess; }
|
||||
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
|
||||
: 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 ();
|
||||
|
|
Loading…
Reference in New Issue