Commit Graph

12 Commits

Author SHA1 Message Date
Jean-Paul Chaput 1dafcbc882 UTurn management in Katabatic & Kite.
* New: in Katabatic, in AutoSegment, recognize segments that are U-turn.
    That is, based on two turn Contacts and going both top or bottom.
* New: In Kite, manage one pitch U-turn by making them diseapear from
    the tracks. And make them same-metal when saving. Add a pack stage
    to try to compact U-turn.
2016-03-06 12:37:30 +01:00
Jean-Paul Chaput ed557d9027 Added support for "same layer" dogleg. Big fix for pad routing.
* Change: In Knik, in Vertex, add a "blocked" flag to signal disabled
    vertexes in the grid (must not be used by the global router).
      Modificate the Graph::getVertex() method so that when a vertex
    is geometrically queried, if is a blocked one, return a non-blocked
    neighbor. This mechanism is introduced to, at last, prevent the
    global router to go *under* the pad in case of a commplete chip.
* New: In Katabatic, in AutoSegment, a new state has been added: "reduced".
    A reduced segment is in the same layer as it's perpandiculars.
    To be reduced, a segments has to be connected on source & target to
    AutoContactTurn, both of the perpandiculars must be of the same layer
    (below or above) and it's length must not exceed one pitch in the
    perpandicular direction.
      To reduce an AutoSegment, call ::reduce() and to revert the state,
    call ::raise(). Two associated predicates are associated:
    ::canReduce() and ::mustRaise().
      Note: No two adjacent segments can be reduced at the same time.
* Bug: In Katabatic, in GCellTopology, add a new method ::doRp_AccessPad()
    to connect to the pads. Create wiring, fixed and non managed by
    Katabatic, to connect the pad connector layer to the lowest routing
    layers (depth 1 & 2). The former implementation was sometimes leading
    to gaps (sheared contact) that *must not* occurs during the building
    stage.
      Remark: This bug did put under the light the fact that the initial
    wiring must be created without gaps. Gaps are closed by making doglegs
    on contacts. But this mechanism could only work when the database if
    fully initialised (the cache is up to date). Otherwise various problems
    arise, in the canonization process for example.
* New: In Katabatic, in AutoContactTerminal::getNativeConstraintBox(),
    when anchored on a RoutingPad, now take account the potential rotation
    of the Path's transformation. Here again, for the chip's pads.
* New: In Kite, support for reduced AutoSegment. TrackSegment associateds
    to reduced AutoSegment are *not* inserted into track to become
    effectively invisibles. When a segment becomes reduced, a TrackEvent
    is generated to remove it. Conversely when it is raised a RoutingEvent
    is created/rescheduled to insert it. All this is mostly managed inside
    the Session::revalidate() method.
* New: In Kite, in KiteEngine::createGlobalGraph(), in case of a chip,
    mark all global routing vertexes (Knik) that are under a pad, as blockeds.
* Bug: In Cumulus, in PadsCorona.Side.getAxis(), inversion between X and
    Y coordinate of the chip size. Did not show until a non-square chip
    was routed (i.e. our MIPS R3000).
* Change: In Stratus1, in st_placement.py add the ClockBuffer class for
    backward compatibility with the MIPS32 bench. Have to review this
    functionnality coming from the deprecated placeAndroute.py.
      In st_instance.py, no longer creates the Plug ring of a Net.
    In my opinion it just clutter the display until the P&R is called.
    Can re-enable later as an option (in Unicorn).
* Change: In Unicorn, in cgt.py, more reliable way of loading then running
    user supplied scripts. Borrowed from alliance-checker-toolkit doChip.py	.
2015-08-16 23:29:28 +02:00
Jean-Paul Chaput 5dc60415e7 Happy new year 2015! 2015-03-17 16:56:55 +01:00
Jean-Paul Chaput 1f9ae36554 Bug fixes for MOSIS SCMOS_DEEP support.
* Change: In Hurricane, the NetRoutingProperty is moved into Hurricane
    from Katabatic. Needed for Knik to be able to access thoses
    informations.
* Change: In Hurricane, in RoutingPad::setOnBestComponent(), now in
    case of identical area, select the component of lowest id.
    This should not be needed if the component ordering was fully
    deterministic as it should be (will investigate later).
      This is to ensure that the choosen component is always the
    same, especially between save/load of a global routing.
* Bug: In Katabatic, in AutoContactHTee::updateTopology(), invalidate
    the segments only if the topology is valid (no NULL in the
    cached segments).
* Bug: In Katabatic, in GCellTopology::construct(), throw an error
    if the topology is bad instead of trying to continue (and core
    dump later... ).
* Bug: In Kite, in BuildPowerRails, distinguish the name of the master
    net in the pad (for vddi, vssi, vdde, vsse, ck, cki & cko) and the
    name of the net in the *chip* netlist. Must use the later to make
    comparison as they may differs.
* Change: In Knik, in save/load solution, exclude nets that are not
    globally routed by Knik. That is which NetRoutingProperty is not
    *Automatic*.
* Bug: In Cumulus, in chip.BlockPower take account of the layer
    width extention to sligthy shrink the connector thus avoiding a
    notch with standart cell in some cases.
* Change: In Cumulus, in chip.ClockTree disable the use of fixed Steiner
    trees for the leaf clocks, as it seems overconstrained for the
    router. First move was to lower them in M2/M3 (instead of M3/M4)
    but that was not sufficent.
* New: In Cumulus, RSavePlugin for recursively saving a physical
    hierarchy.
* New: In documentation, first embryo for RDS file. Should have been
    in Alliance git, but I prefer to keep newest doc in Coriolis.
2014-09-21 16:44:37 +02:00
Jean-Paul Chaput 0cced62851 Kite is now deterministic, given a global routing.
* Bug: In Kite, in TrackCost, the boolean attribute "_forGlobal" was not
    initialized in the constructor causing the non-deterministic behavior.
    Arrrrgggghhhhhh.
* Bug: In Kite, in PyKiteEngine, forgot to perform the
    "balanceGlobalDensity()" in the layer assign Python wrapper, another
    cause for non-determinism.
* Change: In Kite, In KiteEngine, print the configuration at the same
    point as in the python script (to get identical output).
2014-07-07 00:42:38 +02:00
Jean-Paul Chaput 2dd36b9624 Support of RoutingGauge, part 2.
In Katabatic & Kite, remove all hard-coded values related to track pitches.
* New: In <Session>, add more convenience function to access RoutingGauge
    characteristics.
* New: In <AutoSegment>, <AutoContact>, add support for the "depth spin",
    that is, if the source/target contacts are going "top" or "down".
    Used to compute the perpandicular pitch. Need a small modification
    of the revalidation mechanism. The observers of <AutoSegment> are
    notified when the spin changes.
* New: In <AutoSegment>, the getPPitch() method allow to compute the
    "perpandicular pitch". For now it is simply the greatest from the
    source perpandicular pitch and the target perpandicular pitch.
    Make uses of the "depth spin".
* New: In <TrackElement>, <TrackSegment>, cache the perpandicular pitch.
    Updated through the notification from the observable.
2014-05-19 17:58:38 +02:00
Jean-Paul Chaput ac85c0cca4 * ./kite:
- New: Whole replacement by Kite3.
2013-12-04 00:59:29 +00:00
Jean-Paul Chaput 17f3207d71 * ./kite:
- New: In NegociateWindow/RoutingEvent, adds a more comprehensive stage
        "Repair". Perform in three stage: first try to place with a relaxed
        constraint (one GCell on each side). Second try to minimize the faulty
        segment. Third perform another "repack perpandicular" but this time
        the faulty segment is re-inserted *before* any of it's perpandiculars.
    - New: In RoutingEvent::cacheAxisHint(), when a segment has a parent, that
        is comes for a "moveUp()", uses the parent axis hint as it's own.
    - New: In State::slackenTopology(), in the global FSM, adds a special
        operation when reaching MaximumSlack: forceOverLocals(), try to insert
        the global on track containing only local segments. Should tend to
        concentrate locals on a small set of shared tracks. Most useful on the
        highest layers.
    - New: In State::slackenTopology(), in the "MoveUp" state, try to find the
        more appropriate segment to move up (Manipulator::desaturate()).
        Effectively move up the longest segment fully enclosing the one we are
        processing.
    - New: In State::slackenTopology(), add a check for fully blocked segments
        in the local segment FSM. Calls State::solveFullBlocked().
    - New: In KiteEngine::createGlobalGraph(), decrease the vertical capacity
        of one track inside the core. Helps smooth the vertical density.
    - Change: In Manipulator::insertInTrack(), when a track is freed for a
        to be inserted changes the priorities so that the segment is immediatly
        inserted. Parallels ripeds and theirs perpandiculars are replaced
        only *after*. This is the opposite of the previous behavior.
    - Change: In NegociateWindow::NegociateOverlapCost(), account the costs
        of terminals only for deep depth layers (M1, M2 & M3).
    - Change: In RoutingEvent::insertInTrack(), expand the excluded interval
        by a half-pitch (2.5l) instead of one lambda.
    - Change: In State::State(), do not uses DiscardGlobal if the ripup count
        exceed 5. Case of the "Strap" segments that can be ripped a lot
        before changing state.
    - Change: In State::_processNegociate(), no longer lock into position
        (fixed) the local terminal segments as a last resort.
    - Change: In RoutingEvent::_processNegociate(), no longer ripup perpandiculars
        when a segment is inserted in a free space. Reduce the number of
        events whithout degrading the routing quality.
    - Change: In State::conflictSolve1_v1b(), if getLongestConflict() is nul,
        ignore the track, the conflict must occurs on another track.
    - Change: In TrackCost, add a flag support. First uses, a flags to prevent
        a local of the topmost layer to ripup a global which is in moveUp
        state.
    - Bug: In State::solveFullBlockage(), after have been freed, reset the
        segment state to "moveUp".
    - Bug: In manipulator::minimize(), the axisHint was miscalculated if the
        punctual span was empty.
2011-01-25 17:16:50 +00:00
Jean-Paul Chaput c19429108e * ./kite:
- New: In RoutingEvent, while routing a full chip, transient full blockages
        may happens due to the initial position of some perpandiculars on theirs
        optimal positions. Check for it and perform a "ripupPerpandicular" with
        the perpandiculars re-routed first (on normal operation, this is the
        reverse).
    - Change: In NegociateWindow::NegociateOverlapCost(), do not account terminals
         if the layer is *above* METAL3 as it is unlikely that it's truly directly
         connected to a terminal (true at least for our designs).
    - Change: In RoutingEvent::State, add a "fullBlocked" flag to perform the
        full blockage direction while building the state object.
    - Change: In RoutingEvent::cacheAxisHint(), when the TrackSegment has parent,
        uses the parent current axis position and not it's axis hint.
    - Change: In Manipulator::insertInTrack(), when the overlapped segment is a
        Local and is completly enclosed (shrinkLeft & shrinkRight), no longer
        rip it up but force a shrink left/right instead. 
    - Bug: In RoutingEvent, the event sorting function was sorting in the *wrong*
        order! The less prioritary first! With the correct sort, we won an
        additionnal 30% in speed (total: 69%). From the "reference" time we have
        a 3.2 speed-up. And we can successfully process denser designs...
2011-01-09 18:08:57 +00:00
Jean-Paul Chaput 3c9d064fd8 * ./Kite:
- New: In BuildPowerRails, special processing for the power ring segments.
        The "diagonal" of vias at each corner is causing a misbehavior of the
        routing algorithm (due to fully saturated GCells in one direction).
        As a temporary fix, extend the segments so they form a "square corner".
        (problem arise on "d_in_i(22)").
    - New: In RoutingEvent::_processNegociate, disable the "isForcedToHint()"
        feature. No noticeable loss of quality or speed.
    - New: In TrackElement/TrackSegment, wraps the AutoSegment parent's mechanism.
        Allows to gets the DataNegociate of either the segment or it's parent.
    - New: State::solveFullBlockages(), dedicated method to solves the case when
        all the allowed tracks of a segment are blocked, tries to moves up
        local segments and to break-up global ones.
    - New: RoutingEventLoop, a more sophisticated way to detect looping.
        Maintain a dynamic histogram of the last N (default 10) segments routeds,
        with the count of how many times they have occurred. If that count
        exeed 40, we *may* be facing a loop.
    - Change: In State::conflictSolve1, implement new policy. The global segments
        no more can be broken by local ones. The idea behind is that breaking
        a global on the request of a local will only produce more cluttering
        in the GCell. Globals must be keep straigth pass through, especially
        inside near-saturated GCells. Globals breaking however can occurs at
        another global's request.
    - Change: In TrackCost, implement the new policy about locals segments that
        cannot break globals segments. The sorting class now accept flags to
        modulate the sorting function. Two options avalaibles: IgnoreAxisWeigth
        (to uses for strap segments) and DiscardGlobals (to uses with locals).
    - Change: In TrackCost, the "distance to fixed" have now an upper bound of
        50 lambdas (no need to be greater because it means it's outside the
        begin & en GCells). Take account not only of fixed segment, but also
        of placed segments which makes bound.
    - Bug: In Track::_check(), while calling each individual TrackSegment check,
        uses it as the *first* argument of the "or", otherwise it may not be
        called.
    - Bug: In ProtectRoutingPad, loop over segment Collections while modificating
        it was producing non-deterministic results. The fact that a collection
        must be not modificated while beeing iterated is becoming a more and more
        painful problem.
2010-12-30 18:42:17 +00:00
Jean-Paul Chaput 37b4e5b423 * ./kite:
- Change: In TrackCost, the ripup cost is now computed from a mix between
        the number of ripup *and* the data state. Restore a correct balance
        of the ripping up between segments.
    - New: In RoutingEvent::State::conflictSolve1(), when a very long Segment
        enters in conflictSolve1(), still prefers to move it up in one piece,
        but if it's not possible, it is unlikely that it will overlap with
        only one or two other Segment. In that cases, blindy break it up in
        the middle.
    - New: In RoutingEvent::Manipulator, another overload of makeDogLeg to
        allow break up at one precise point.
    - Change/Bug: In RoutingEvent::Manipulator::Relax(), reset the state of
        the non-overlapping Segment fragments instead of inheriting blindly
        of the state of the breaked up one. Gives some supplemental slack
        that allows to converge.
    - Note: Now the strategy is to disable the uses of GCellRoutingSet by
        setting the expand step to 0.99. This induces only a slight slow
        dow and memory increase and passes all the tests...
    - Mark: This revision passes all the benches except for idct, vld &
        ieee_division.
2010-05-03 09:16:50 +00:00
Jean-Paul Chaput 5dd8cb502a * ./hurricane/src/hviewer,
./coriolis/src/crlcore,
     ./coriolis/src/knik,
     ./coriolis/src/katabatic,
     ./coriolis/src/kite,
     ./coriolis/src/equinox,
     ./coriolis/src/solstice,
     ./coriolis/src/ispd:
     - SVN MOVE: Source tree simplification & uniformisation. Now all tools
         are at the same level, directly under the root of the repository.
         No more "coriolis/src".
2010-03-09 15:24:55 +00:00