Commit Graph

1715 Commits

Author SHA1 Message Date
EricLaoGitHub e1724ca785 Dijkstra and Net can manage different wire width.
in Dijkstra.cpp/.h, Edge.cpp/.h, GCell.cpp/.h:
*Change: GlobalRouting wires can have different wires' width. One Net's wires has one width only.

in NetRoutingProperty.cpp/.h, PyNetRoutingProperty.cpp/.h:
*New: A wire width parameter is added. It can be set through python script.
2017-06-14 10:46:54 +02:00
Jean-Paul Chaput 8d4fdf3471 TrackCost clean support for symmetric and wide segments.
* New: In Katana::TrackCost, the TrackElement and it's optional
    symmetric are now kept as attribute of a TrackCost. The cost
    is completly computed inside the constructor.
      TrackCost now support any mix of symmetric event and wide
    segments.
      The cost is now computed by adding directly to the current
    one instead of creating secondaries that are merged afterwards.
    As a consequence, remove all copy construction and merge
    capabilities.
      All the various methods used to compute the cost are renamed
    "addOverlapcost()" in all the various related objects.
      As a reminder, the overal cost method call is as follow:
        1. TrackCost constructor on a TrackElement.
           2. Call TrackElement::addOverlapcost()
              3. For all Track under the TrackElement, call
                 Track::addOverlapCost()
                 4. For all other TrackElement intersecting with
                    the overlap interval call:
                    TrackElement::incOverlapCost()
                    5. The callback overlap function for segments
                       is called (defined in NegociateWidow).
      Don't confuse:
      - TrackElement::addOverlapCost(), which compute the cost of
          inserting the segment inside a track (or a set of).
      - TrackElement::incOverlapCost(), which compute the cost of
          overlaping with this already inserted segment. It is the
          other way around of the previous one.
* Change: In Katana::SegmentFsm, use a vector of pointer to TrackCost
    instead of an object to avoid copy construction.
2017-06-10 12:27:25 +02:00
Jean-Paul Chaput 8a73b03fd8 Synchronize priority of TrackSegments connecteds through doglegs.
* Bug: In Anabatic::Dijsktra, correct the indentation in cdebug calls
    (lots of them causing a big shift right).
* New: In Anabatic::TrackSegment, new helper structure SideStack to
    manage a set of aligned GCells and their various sides sizes.
* Change: In Anabatic::TrackSegment::computeOptimal(), more accurate
    computation of attractors from global segments and variable size
    GCells using SideStack.
* Change: In Katana::DataSymmetric::checkPairing(), increase the tolerance
    for misaligned symmetrics from 2 to 5 tracks (should be enough for our
    narrow channel routing).
* New: In Katana::TrackSegment, add a first flag to enable locking of
    priority. If it is set, calls to either "computePriority()" or
    "forcePriority()" will have no effect. Added the uint32_t flags
    paraphernalia.
* New: In ::computeNetPriority(), overall function to control the call
    of TrackSegment::computeAlignedPriority(). The call is done from
    NegociateWindow::run().
* New: Katana::TrackSegment::computeAlignedPriority(), order the
    TrackSegments aligneds through doglegs to the one with the highest
    priority is routed first and others progressively from him. Done by
    forcing an ever decreasing priority on the aligneds ones.
      The amount of decrease is small so the aligned segments got routed
    (ordered) in close, if not contiguous, sequence. Priority is locked
    for the order to remain.
* Bug: In Katana::TrackSegment::computePriority(), correct computation
    of the priority when there is more than 10 free tracks
    (a DbU::toLambda() call was missing, leading to very big priorities).
* Change: In katana::TrackCost CTOR, do not compute a distance to fixed
    in the case of analog segments, this is backfiring.
      Slight change of the compare function when delta differs. Seems
    to improve a little.
2017-05-30 22:33:06 +02:00
Jean-Paul Chaput 1e49da1976 Select S/T in AutoSegments_Aligneds. Priority moved to TrackSegment.
* In Katana::AutoSegments_Aligneds, allow the the caller to select
    if we are propagating through source or target only (or both).
    Note that if no flag is given, it is assumed that we want to
    propagate the old way on both source and target.
* In Katana::TrackElement, Katana::TrackSegment and Katana::RoutingEvent,
    move the event priority from RoutingEvent to TrackSegment.
    Add accessor and mutators associated in TrackElement (virtual
    methods).
2017-05-27 20:35:28 +02:00
Jean-Paul Chaput e12e45e495 Rename SymmetricStage into PairSymmetrics, plus small cleanup. 2017-05-26 13:32:30 +02:00
Jean-Paul Chaput 3e825cc228 Katana routing algorithm adjustements for analog routing.
* Bug: In Hurricane::Interval, the ::getSize() method was returning a negative
    length when the Interval was empty. Now return zero. This was causing
    slight cost functions side effect when computing the overlap of a segment
    with another one belonging to the same net (i.e. shareDelta)
* Bug: In Katana::AutoSegment::computeOptimal(), checks that the optimal
    position for the axis is indeed inside the GCell interval.
* Bug: In Katana::DataSymmetric::getSymmetrical(Interval&), reverse the shrink
    applied to GCells sides. Interval are of the type [min:max[ so after
    symmetric transformation they become ]smax:smin]. Apply a correction so
    that they are [smax:smin[ and could be merged with the paired interval
    (the one without symmetry applied).
* Bug: In katana::TrackCost::consolidate(), the overlap (now) always positive,
    and must be *substracted* to the "delta" (not *added*).
* Bug: In Katana::_computeNetOptimals(), now skip the already processeds
    AutoSegments instead of re-processing them.
* New: In Katana::AutoSegment::computeOptimal(), improved computation of
    the axis hint:
      - For analog net, propagate through the simple doglegs to find
        attractors.
      - Restrict the allowed interval to the union of GCell sides and
        segments constraints that are terminals.
      - Consider a local as "long" if it's length exceed 20 the P-pitch.
        (maybe make that a tool parameter).
2017-05-23 00:20:31 +02:00
Jean-Paul Chaput e78c3f21ef Added analog type on segment NetRoutingProperty.
* New: In Anabatic_AutoSegments collection, added a Flag to the constructors
    to allow different behavior between digital and analog modes.
      For "Aligneds" and "Perpandiculars" collections, now manage a new
    Flag WithDoglegs to follow aligned globals through local doglegs
    (for analog nets).
      Adjust the log level of collections to 144 (formerly 145).
* New: In Anabatic::AutoSegment, new flag SegAnalog for segments that are
    part of an analog net.
      Note that with this flag, we reach the 32 bits limit...
* Change: In Anabatic::Constants, Flags are now declared as BaseFlags
    objects and *not* uint64_t. This avoids overload resolution problems with
    arithmetical overload of the operators.
      The BaseFlags/Flags types are now completly "isolated" from the
    uint64_t, it has the advantage of showing where unwanted previous implicit
    conversions where occuring.
* Change: In Katana::Constants, Flags values are now of BaseFlags type instead
    of uint64_t.
* Change: In Anabatic::Dijkstra, lots of log cleanup.
* Change: In Anabatic::GCell::getSide(), make the "shrink" parameter visible
    to allow to substract the topmost and rightmost track for axis span
    computation in AutoSegment::computeOptimal(). Used for analog mode.
* Change: In NetRoutingState, added a flag for analog mode. Use uint32_t
    for the flags type.
* New: In Isobar, export the NetRoutingState and NetRoutingExtension objects.
2017-05-20 12:33:12 +02:00
Jean-Paul Chaput c1be52f0e2 Merge branch 'devel_anabatic' of ssh://bop-t/users/largo2/git/coriolis into devel_anabatic 2017-05-16 14:55:43 +02:00
Jean-Paul Chaput d07cdf03e9 Replace "unsigned int" by "Flags" in all AutoSegments collections.
* Change: In Anabatic::AutoSegments collections, change the type of all
    the flags that where in "unsigned int" (32 bits) to Flags (uint64_t)
    as there is now more than 32 flags for functions.
* New: In Ababatic::Constants, added new flag Flags::WithPerpands, which
    makes the number of flags tip over 32 bits, thus making mandatory
    to uses Flags and not unsigned int.
* New: In Anabatic::AutoSegments_Perpandiculars, manage a new flag
    Flags::WithDoglegs to allow to propagate through global segments that
    are connecteds via doglegs on local segments. Meaning that there is
    a good chance that they could be aligned.
      Slighly change the way we propagate on aligned segments: no longer
    check for VTee or HTee, but only for same direction and layer as
    master.
* New: In Anabatic & Katana, replace all the "int", "long" and their
    variants by the less implementation ambiguous "int32_t", "int64_t"
    (and variant). This should help to better detect bit trucation in
    flags.
      Use the type to give a hint about the flags kind:
        - Type "Flags", for flags shared among Anabatic & Katana
          functions/methods (may also appear in some objects states).
        - Type "uint32_t" for flags belonging to an object internal
          state of from Hurricane functions flags (those should be
          grouped in a Flag subclass in a perfect world).
2017-05-16 14:53:33 +02:00
EricLaoGitHub 6d6ca6363c KatanaEngine.cpp:
- DataSymmetric's destroy() cause some memory issues. TO BE INVESTIGATED.
2017-05-15 18:47:01 +02:00
Jean-Paul Chaput faf9688165 Merge branch 'devel_anabatic' of ssh://bop-t/users/largo2/git/coriolis into devel_anabatic 2017-05-11 17:41:24 +02:00
Jean-Paul Chaput c44c6b13f3 Adjust Katana event sort. CMake detection of Python 2.7 only.
* Change: In all top CMakeLists.txt, force the use of Python 2.7 as
    we do not compile against 3.x flavors. Do not use the "EXACT"
    flags as it will not recognize 2.7.x versions.
* Change: In Katana::RoutingEvent::Key::Compare(), preliminary
    experiments shows that the best sorting order is:
      - Lower layer first (i.e. M2 -> M3 -> M4 -> ... )
      - Longer segments first.
      The later seems to be counter-intuitive. Guess is that placing
    the small ones first generate a more important fragmentation of
    the big ones. They are placed too early and are difficult to move
    afterwards.
      Another feature to test is *not* inserting pushed left/right
    segments if they are not *already* routed.
* Change: In PyKatanaEngine.runNegociate() now takes a flag argument,
    provided through the new PyKatanaFlags exported object.
    (doChip.py must be changed accordingly)
2017-05-11 17:26:56 +02:00
EricLaoGitHub 371946c1c0 - Minor debug test fix 2017-05-11 14:02:49 +02:00
EricLaoGitHub ef0971075d Merge branch 'devel_anabatic' of ssh://bop.soc.lip6.fr/users/largo2/git/coriolis into devel_anabatic 2017-05-11 11:37:44 +02:00
EricLaoGitHub 86df627d01 Dijkstra.cpp:
- Minor debug text
2017-05-11 11:24:19 +02:00
Jean-Paul Chaput bf7e2fdd2d Merge branch 'devel_anabatic' of ssh://bop-t/users/largo2/git/coriolis into devel_anabatic 2017-05-09 18:40:40 +02:00
Jean-Paul Chaput f1b2035cb0 Support for profiling the priority of events in Kite & Katana.
* New: In Katana::Configuration, added "katana.profileEventCosts" to
    triggers the event's profiling.
* New: In Katana::NegociateWindow::_negociate(), save a profiling
    trace of all the events and their priority, separated by metal,
    for later analysis (see doChip.py in alliance-check-toolkit).
* New: In Katana::RoutingEvent::Key::Compare(), start implementing
    new segment freedom degree functions.
* Change: In Hurricane::Net::_getString(), put a more complete
    information about the Net instead of just only it's name.
* Bug: In Katana, reorder the various stages so that they are
    executed in the exact same sequence as in "doChip.py" so now
    routing in graphic mode and text mode gives exactly the same
    results.
* Bug: In Katana::PyKatanaEngine, runGlobalRouter do not take any
    argument.
2017-05-09 18:33:55 +02:00
Roselyne Chotin-Avot 6c229ce076 Remove ‘-‘ from zsh shell on MacOS 2017-05-05 12:01:26 +02:00
Jean-Paul Chaput db8e51524f Deterministic destruction of Components.
* Change: In Hurrican::Component::_preDestroy(), the cascaded destruction
    of slaves Components and subsequent ring merge and Rubber creation
    was using set<> sorted on pointer values. This was making the order
    of destruction of the slaves components non-deterministic. Now the
    sets are sorted according to their id (see Entity).
* Change: In Hurricane::SharedProperty, the _ownerSet is now a vector<>
    instead of a set<>. This will slow the search process, but hopefully
    this is needed only during construction/destruction of a Property
    so the slow down shouldn't be too much.
      This has also an impact on Hurricane::Relation.
2017-05-03 18:09:51 +02:00
Jean-Paul Chaput 73a085308c Merge branch 'devel_anabatic' of ssh://bop-t/users/largo2/git/coriolis into devel_anabatic 2017-04-30 23:47:55 +02:00
Jean-Paul Chaput ef69a6d586 Support for symmetric routing in Anabatic/Katabatic.
* New: In Katana::SegmentFsm, the object is now able to handle two events
    at the same time. The master and it's symmetric. When there is no
    symmetric, the corresponing data is just left blank. This makes a
    bigger object, but as there is only one when running, it is not an
    issue.
      Candidates tracks are now an vector of array<2> (pairs), the
    TrackCost::Compare() functor has to be wrapped through CompareCostArray.
    The compined TrackCost of the two tracks is accumulated into the first
    element.
      Everything related to events gets duplicated: _event is now _event1
    and _event2, and so on.
      As there can be now two Manipulator actions done with SegmentFsm,
    this class now completly hide the Manipulator level from the
    RoutingEvent processing.
      New function ::bindToTrack() to perform the track insertion.
* New: In Katana::TrackCost, add a new ::merge() function.
* New: In Katana::TrackElement and Katana::TrackSegment, add symmetric
    management. Allows to know if a TrackElement has a symmetric and to
    access it.
* New: In Katana::DataSymmetric, add new overload for ::getSymmetrical()
    to handle DbU::Unit and intervals.
* Change: In Katana::RoutingEvent, remove all direct uses of Manipulator
    objects. Now any change to the event associated segment must go through
    call to Segment Fsm.
* Change: In Katana, adjust the debug level so internal informations are
    put below level 156.
* New: In Hurricane::DbU, in ::getValueString(), special display when the
    value is Min or Max (more helpful than a gigantic number).
2017-04-30 23:46:33 +02:00
EricLaoGitHub fdc6088ba6 - in Dijkstra.cpp .h:
- Data management concerning Analog GCells optimized
  - Improvements of analog paths estimation:
    - Save intervals to memorize paths
    - Handle equal distance paths
2017-04-25 18:06:53 +02:00
EricLaoGitHub 3d919ef7b0 Merge branch 'devel_anabatic' of ssh://bop.soc.lip6.fr/users/largo2/git/coriolis into devel_anabatic 2017-04-18 11:59:29 +02:00
EricLaoGitHub 8bf1f63557 Pre-commit for updating git depositary. 2017-04-18 11:58:55 +02:00
Jean-Paul Chaput 2396ff7120 Fully automatic shell detection. Automatic switch to Debug. 2017-04-14 12:09:48 +02:00
Jean-Paul Chaput 4126a53406 More reliable detection of libbfd. 2017-04-13 17:04:35 +02:00
Jean-Paul Chaput a2f1db27db Search for *both* libfd binutil specific and generic one. 2017-04-13 14:28:14 +02:00
EricLaoGitHub eeeb3ff67e in Dijkstra:
- Paths lengths are better estimated when a path goes through successive horizontal channels (same goes for successive vertical channels).
2017-03-20 17:38:29 +01:00
Jean-Paul Chaput 880b1817ce In CellPrinter, adds the DPI and the Orientation as config. parameters. 2017-03-15 17:59:00 +01:00
Jean-Paul Chaput 210f307270 In CellPrinter makes the cartouche dimension adapt to the DPI.
* Change: In Hurricane::CellPrinter::pageDecorate(), the size of the
    cartouche was computed for a DPI of 150. Now it is computed to
    expand as the DPI increase (scale from the 150 DPI values).
2017-03-15 16:05:30 +01:00
Jean-Paul Chaput 00ea8f0205 Display selection when drawing on printing devices.
* Bug: In Hurricane::CellWidget, when setting up a state of a CellWidget,
    the selection was not copied. Now copy the SelectorCriterion (clone).
* New: In Hurricane::SelectorCriterion, add a clone() method.
* Change: In CRL Core, in etc/common/display.conf, for the Printer.Coriolis
    style, lower the thresold of display for the substrate layers so they
    are shown even in small zoom mode.
2017-03-15 14:37:32 +01:00
Jean-Paul Chaput cf449945fc Force the printer resolution to 150 DPI instead of copying the screen. 2017-03-13 18:32:30 +01:00
Jean-Paul Chaput b99a362509 Apaired segments building for symmetric routing (step 1).
* Change: In Hurricane::BaseFlags, store flags in uint64_t instead of
    unsigned int because we start to need more than 32 different flags
    in some tools.
* New: In ::getString() & ::getRecord() templates, add support for
    std::array<>.
* Change: In CRL::ToolEngine, add support for timer (time & memory
    measurements) displaced from Katabatic. This way all ToolEngine
    can use this feature. The _postCreate() method display the
    memory just after ToolEngine allocation.
* Change: In Etesian::EtesianEngine, make use of the ToolEngine
    builtin timer (remove the local one). Forgot to call the base
    class _postCreate() and _preDestroy().
* Change: In Anabatic::AnabaticEngine, make use of the ToolEngine
    builtin timer (remove the local one).
* New: In Anabatic, new AutoSegments_Connecteds() collection. This
    Collection allows a deterministic walkthough *all* the AutoSegments
    connected either to source or target of one AutoSegment.
* New: In Anabatic::AutoContactTerminal::isEndPoint() to check if an
    AutoContactTerminal is the *only one* anchored on a RoutingPad,
    thus being a true "end point" and not a kind of feed-through.
* New: In Katana::KatanaEngine, added support for symmetric nets.
    Created new class DataSymmetric to store symmetric information
    of a net (mainly the paired AutoSegments).
      Added KatanaEngine::runSymmetricRouter(), for now only build
    the DataSymmetric informations. More to come...
* Change: In Katana::GraphicKatanaEngine::_runTest(), now perform
    symmetric information building the non-symmetric routing.
2017-03-12 19:34:12 +01:00
Jean-Paul Chaput b820d22daa Merge branch 'devel_anabatic' of ssh://bop-t/users/largo2/git/coriolis into devel_anabatic
Conflicts:
	anabatic/src/Dijkstra.cpp
2017-03-12 17:09:16 +01:00
Jean-Paul Chaput a6da434878 Removing some noisy debug messages. 2017-03-12 17:05:55 +01:00
EricLaoGitHub 345ca78ade In Dijkstra.cpp/.h:
- GlobalRouting takes into account self symmetries and symmetries in pair of nets according to an axis. Self symmetries are symmetries considering one net symmetric to an axis. During the materialize step, they are routed symmetrically according to the axis. Symmetries in pair of nets follow the same principle but with 2 nets.

In LocalGlobalRouting.cpp:
- Minor bug fixed
- Verbose commented

in NetRoutingProperty.cpp/.h:
- Some flags methods  methods added
2017-03-08 17:49:23 +01:00
Jean-Paul Chaput 44a2f574bc Accurate measuring of memory usage under Linux.
* Change: In Hurricane::Timer, measuring memory usage through the increase
    of sbrk() gives erroneous results. Under Linux, now read the
    /proc/[pid]/statm which gives the real size of the virtual memory
    of the process. There is also code for reading /proc/[pid]/mmap
    but it gives only the resident size of the process (i.e. swapped
    pages are *not* accounteds).
* Change: In Katabatic, Anabatic, Kite & Katana now reports the total
    memory size of the program.
2017-02-25 18:21:55 +01:00
Jean-Paul Chaput 086e40ec7d Katana::runTest to setup net symmetry for gmChamla nets. 2017-02-24 14:37:11 +01:00
Jean-Paul Chaput fe14547b62 Added symmetric support in NetRoutingProperty.
* New: In Hurricane::NetRoutingProperty, added various flags for
    symmetric support, axis and slave net (if any).
      Json support is not complete yet: have to remember how to
    get the slave net when present.
2017-02-22 23:09:12 +01:00
Jean-Paul Chaput 0925afa188 UpdateSession forgotten in Blif parser. 2017-02-16 09:57:43 +01:00
EricLaoGitHub 4559ec38b9 Merge branch 'devel_anabatic' of ssh://bop.soc.lip6.fr/users/largo2/git/coriolis into devel_anabatic 2017-02-14 15:52:08 +01:00
EricLaoGitHub 5b94fe1917 In LoadGlobalRouting.cpp:
- [Modified] Minor bug fixed

in Dijkstra:
- [Add]: Global routing for analog circuits is enhanced by intervals definition to estimate more precise wirelengh and wire positions. The distance calculation for analog cases has been moved to the horus tool in AnalogGlobalRoute.h.
2017-02-14 15:47:22 +01:00
Jean-Paul Chaput 3777c34834 Bug: bad managment of the csh case. 2017-02-08 18:26:20 +01:00
Jean-Paul Chaput (acting Coriolis) aaeeef0097 In 32 bits, do not throw errors when DbU exceed 32 bits. 2017-02-08 18:24:13 +01:00
Jean-Paul Chaput 3598c6d8f7 Disjksta::setDistance() now return a pointer to the copied object.
* Change: In Anabatic::Dijkstra the _distanceCb attribute got copied
    from the setDistance() argument. To be able to access the duplicated
    distance (and therefore access/modify it) the function now return a
    pointer to it. Done with the "target()" accessor of std::function<>.
* Change: In Katana::GlobalRouting::runGlobalRouter() use the new
    Disjkstra::setDistance() to be able to call setNet() on the right
    object.
2017-02-06 21:59:15 +01:00
Jean-Paul Chaput f8b9957d20 Bug: reduced segments where axis was not set when placed.
* Bug: In Kite::RoutingEvent::_processNegociate(), on insertion in free
    space of a reduced segment (less than one pitch) no insert event
    was generated, but the axis was not set to the selected track, leaving
    the segment at it's former place.
      Now, generate an insert event, but in Kite::Session::_revalidate()
    filter them so that reduced segments are not inserted in tracks but
    only have their axis set.
      Correction also applied on Katana.
* Bug: In Kite::wipeoutRouting(), the removal was incomplete. We need to
    remove anchored Contacts, but in a second stage. This is a fragile
    workaround as it require that there is only one level of anchoring.
2017-02-06 20:58:57 +01:00
EricLaoGitHub 1f4d2a75ef - Add: New distance estimation in Dijsktra for Analog GCells. Still in developement ... 2016-12-22 11:21:25 +01:00
EricLaoGitHub 49546aee26 - BUG: Detailed Routing should perform correctly now. Corrected a bug where cases in HChannel and VChannel were not handled properly. 2016-12-20 16:10:30 +01:00
Jean-Paul Chaput 4163fc044a In Anabatic, check if there is at least one METAL1 in singleGCell().
* Bug: In Anabatic::singleGCell(), in some analogic design, there may be
    not a single METAL1 in the GCell. Issue a clean warning instead of
    going ashtray.
* Change: In CRL.etc/technology.cong & CRL.etc/display.conf, add a "metbot_r"
    as a real layer when "metbot" symbolic layer is distinct from a normal
    metal.
2016-12-15 19:25:05 +01:00
Jean-Paul Chaput bdc474d7fc Quieter helpers initialisation, isderived() alternative to isinstance().
* New: In CRL.python.helpers, all methods make use of the quiet mode to
    allow completly silent initialisation.
      Introduce isderived() function to check the derivation relationship
    of two C++ encapsulated classes by Isobar. The Python isinstance do
    not work, all C++ wrapped classes are of the base type 'type'.
    isderived() uses the MRO mechanism (Method Resolution Order) as a
    workaround. I can't find in the documentation if it's the expected
    behavior or if i did miss something in when building my classes.
2016-12-12 17:06:53 +01:00