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:
Jean-Paul Chaput 2014-07-02 14:36:58 +02:00
parent 7296dcd6fb
commit 20d25b2053
31 changed files with 912 additions and 379 deletions

View File

@ -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"

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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.

View File

@ -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.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -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

View File

@ -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.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -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"

View File

@ -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 |

View File

@ -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

View File

@ -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;
}

View File

@ -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 );
}
}
}

View File

@ -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;
}

View File

@ -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.

View File

@ -46,6 +46,7 @@ namespace Katabatic {
, KbHalfSlacken = 0x00800000
, KbNoGCellShrink = 0x01000000
, KbCParanoid = 0x02000000
, KbCreate = 0x04000000
, KbDirectionMask = KbHorizontal|KbVertical
};

View File

@ -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; }
// -------------------------------------------------------------------

View File

@ -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

View File

@ -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 );

View File

@ -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();
}

View File

@ -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 );
}

View File

@ -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() );

View File

@ -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 ();

View File

@ -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.");

View File

@ -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(); }

View File

@ -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 ();