// -*- C++ -*-
namespace Katabatic {
/*! \class KatabaticEngine
*
* \brief The Katabatic Tool
*
*
* \section secEngineStates States of KatabaticEngine
*
* During it's lifecycle, the engine go through a serie of states.
* It only can go forward between states.
* - \b EngineCreation : just after C++ object creation until
* the global routing is loaded.
* - \b EngineGlobalLoaded : \e after the global routing has
* been done. This state must be set by an external tool,
* Katabatic cannot know by itself when the global routing
* has been done (see Kite).
* - \b EngineActive : \e after the global routing has been
* converted into the Katabatic data structure. At this point
* the tool is ready to run.
* - \b EngineDriving : \e during the stage of stripping all
* the decorations the tool has added over the Hurricane data
* structure (mostly: AutoContact & AutoSegment).
* - \b EngineGutted : \e after the tool decorations have been
* removed. The tool is now useless and can only be destroyed.
* - \b EnginePreDestroying : this special state is reached when
* going straight from EngineActive to the destructor, that is,
* skipping the EngineDriving state. That means we do not
* want to save whatever routing has been done. In that case,
* not only the tool decorations are destroyeds, but also the
* Hurricane data-structures they relies on (Contact, Segments).
*
*
* \section secEngineImpl KatabaticEngine Implementation Details
*
* Due to the size of the code and the fact that the main body
* of some methods do not need to be present in the class,
* the implementation of KatabaticEngine is split in several
* files. The list below summarize them:
* - \c KatabaticEngine.cpp : the core of the class, methods that really
* need their bodies here.
* - \c PowerRails.cpp : utilities to construct an abstract from all
* the power rails through the hierarchy.
* - \c LayerAssign.cpp : layer assignement related methods and helpers.
* - \c LoadGrByNet.cpp : global routing loader, transform global routing
* into Katabatic data-structure.
* - \c NetConstraints.cpp : compute the topological constraints of all
* AutoSegment/AutoContact of a Net.
* - \c NetOptimals.cpp : compute the optimal positions of all AutoSegment
* of a Net.
*/
//! \enum EngineState
//! Describe the current state of the KatabaticEngine.
//! \var EngineCreation
//! The tool is created, but still in the \c _postCreate stage.
//! \var EngineGlobalLoaded
//! The global routing has been loaded from Knik.
//! \var EngineActive
//! The Engine is in normal running mode (routing ordinary wires).
//! \var EngineDriving
//! The Engine is transforming the AutoContact/AutoSegment into
//! normal Contact/Segment (prior to tool deletion).
//! \var EnginePreDestroying
//! This state is used whenever the tool is destroyed without passing
//! through the EngineDriving state.
//! \var EngineGutted
//! After the EngineDriving state, all the working structures are
//! removed and the tool can no longer be used. It only awaits clean
//! destruction.
//! \typedef set KatabaticEngine::NetSet;
//! Set of Net to be routed, alphabetically sorteds.
//! \function KatabaticEngine* KatabaticEngine::create ( Cell* cell );
//! Create a KatabaticEngine on \c cell.
//! \function const Name& KatabaticEngine::staticGetName ();
//! \sreturn The unique string identifier for the KatabaticEngine class of ToolEngine.
//! \function bool KatabaticEngine::isGMetal ( const Layer* layer ) const;
//! \sreturn \true if \c layer is one of the special (fake) metals used to build
//! the global routing.
//! \function bool KatabaticEngine::isChip () const;
//! \sreturn \true if the hierarchy top-level of the Cell matches the one of a complete
//! design (i.e. pads and one core instance).
//! \function bool KatabaticEngine::isInDemoMode () const;
//! \sreturn \true if the tool is in demo mode, that is suppress almost all warning
//! and debug messages.
//! \function bool KatabaticEngine::doWarnOnGCellOverload () const;
//! \sreturn \true if the tool should issue a warning when a GCell is overloaded
//! (overload could be transient).
//! \function bool KatabaticEngine::doDestroyBaseContact () const;
//! \sreturn \true if the EngineDestroyBaseContact is set, meaning that when an
//! AutoContact is destroyed, the Contact it decorates is destroyed
//! altogether.
//! \function bool KatabaticEngine::doDestroyBaseSegment () const;
//! \sreturn \true if the EngineDestroyBaseSegment is set, meaning that when an
//! AutoSegment is destroyed, the Segment it decorates is destroyed
//! altogether.
//! \function bool KatabaticEngine::doDestroyTool () const;
//! \sreturn \true if the tool state is beyond EngineStateGutted, that is, only
//! waits for \c destroy() to be called.
//! \function const Name& KatabaticEngine::getName () const;
//! \sreturn The unique string identifier for the KatabaticEngine class of ToolEngine.
//! \function EngineState KatabaticEngine::getState () const;
//! \sreturn The state the tool is currently in.
//! \function unsigned int KatabaticEngine::getFlags ( unsigned int mask ) const;
//! \sreturn The \e anded combination of the tool flags and \c mask.
//! \function Configuration* KatabaticEngine::getKatabaticConfiguration ();
//! \sreturn The Configuration of Katabatic. In this class it is redundant with
//! getConfiguration(), but may be useful in derived classes.
//! \function Configuration* KatabaticEngine::getConfiguration ();
//! \sreturn The Configuration of the current ToolEngine.
//! \function RoutingGauge* KatabaticEngine::getRoutingGauge () const;
//! \sreturn The RoutingGauge (Configuration shortcut).
//! \function RoutingLayerGauge* KatabaticEngine::getLayerGauge ( size_t depth ) const;
//! \sreturn The RoutingLayerGauge associated to \c depth (Configuration shortcut).
//! \function const Layer* KatabaticEngine::getRoutingLayer ( size_t depth ) const;
//! \sreturn The routing Layer associated to \c depth (Configuration shortcut).
//! \function Layer* KatabaticEngine::getContactLayer ( size_t depth ) const;
//! \sreturn The contact Layer associated to \c depth (Configuration shortcut).
//! \function DbU::Unit KatabaticEngine::getGlobalThreshold () const;
//! \sreturn The length above which a global wire is moved up in the layer assignment
//! stage (Configuration shortcut).
//! \function float KatabaticEngine::getSaturateRatio () const;
//! \sreturn The ratio above which a GCell is considered to be saturated
//! (Configuration shortcut).
//! \function DbU::Unit KatabaticEngine::getExtensionCap () const;
//! \sreturn The wires extension cap, same for all layers for the time beeing
//! (Configuration shortcut).
//! \function size_t KatabaticEngine::getSaturateRp () const;
//! \sreturn The number of RoutingPad above which a GCell is saturated, causing
//! extras global segments to be moved up.
//! (Configuration shortcut).
//! \function GCellGrid* KatabaticEngine::getGCellGrid () const;
//! \sreturn The GCellGrid.
//! \function const NetSet& KatabaticEngine::getRoutingNets () const;
//! \sreturn The set of nets to be routeds.
//! \function const ChipTools& KatabaticEngine::getChipTools () const;
//! \sreturn The chip tools (for whole designs).
//! \function void KatabaticEngine::xmlWriteGCellGrid ( ostream& );
//! Write in a stream all informations on the GCells in XML format.
//! \function void KatabaticEngine::xmlWriteGCellGrid ( const string& );
//! Write in a file all informations on the GCells in XML format.
//! \function void KatabaticEngine::setState ( EngineState state );
//! Force the state of the tool. Must be used with caution, as no sanity
//! checks are performeds. This method is normally invoked from inside
//! the KatabaticEngine various methods.
//! \function void KatabaticEngine::setFlags ( unsigned int flags );
//! Set the flags given in \c flags.
//! \function void KatabaticEngine::unsetFlags ( unsigned int flags );
//! Reset the flags given in \c flags.
//! \function void KatabaticEngine::setGlobalThreshold ( DbU::Unit );
//! (Configuration shortcut).
//! \function void KatabaticEngine::setSaturateRatio ( float );
//! (Configuration shortcut).
//! \function void KatabaticEngine::setSaturateRp ( size_t );
//! (Configuration shortcut).
//! \function void KatabaticEngine::startMeasures ();
//! Starts memory consuption & time measurements.
//! \function void KatabaticEngine::stopMeasures ();
//! Stops memory consuption & time measurements. Recorded measures are
//! kept until the next call to Katabatic::startMeasures().
//! \function void KatabaticEngine::printMeasures ( const string& tag ) const;
//! Print memory & time measurement on ``cmess1``. If \c tag is not empty,
//! also adds the measurement to the internal table (with \c tag as label).
//! \function void KatabaticEngine::refresh ( unsigned int flags=KbOpenSession );
//! In case the tool is associated with a graphic display, trigger
//! a full redraw of the Cell. Slow the router but allow to see work
//! in progress... If \c flags do not contains \c KbOpenSession
//! the refresh operation will not be enclosed inside it's own session.
//! This assumes that a session is already opened.
//! \function void KatabaticEngine::makePowerRails ();
//! Detect all the aligned segments of same width that compose power
//! rails, unificate them and copy them at the design top level.
//! \function void KatabaticEngine::createDetailedGrid ();
//! Allocate the GCellGrid.
//! \function void KatabaticEngine::loadGlobalRouting ( unsigned int method, NetSet& nets );
//! \param method the loading algorithm
//! \param nets the set of nets to route.
//!
//! Convert the global routing into the initial detailed routing. For the
//! time beeing, only one loading algorithm is available: net by net
//! (EngineLoadGrByNet). Only Net given in \c nets are routeds. If \c nets is empty
//! then all ordinary nets are routeds. In either cases the set of nets to route
//! is pruned from any power, ground or clock signals.
//!
//! \remark The tool state must be \b EngineGlobalLoaded \e before calling this method
//! and will be set to \b EngineActive on exit.
//! \function void KatabaticEngine::layerAssign ( unsigned int method );
//! Perform the layer assignment. The global routing loading stage uses only
//! the two bottom most layers, this method spread them on all the availables
//! routing layers, according to GCell and RoutingPad density criterions.
//!
//! Two algorithms are availables:
//! - \b EngineLayerAssignByLength : the global wires are moved up one by
//! one.
//! - \b EngineLayerAssignByTrunk : if one global wire of a net is to be
//! moved up, then all the global trunk of the net is moved along.
//! This methods gives the best results for now.
//! \function void KatabaticEngine::finalizeLayout ();
//! Transform the Katabatic wires into the Hurricane data-structure.
//! Mostly by removing the AutoSegment/AutoContact \e without removing
//! their Hurricane conterparts. May also fill gaps that may have appeared.
//!
//! \remark The tool state must be \b EngineActive \e before calling this method
//! and will be set to \b EngineGutted on exit.
//! \function void KatabaticEngine::slackenBorder ( Box bb, Layer::Mask mask, unsigned int flags );
//! \param bb The bounding box, defines the edges.
//! \param mask Consider only layers that are fully included in that mask.
//! \param flags Consider only segment in that direction.
//!
//! Perform a preventive break on all global segments going through the
//! \e vertical left and right edges of the \c bb box. The set of global
//! segments to be broken could be further restricted using \c mask and
//! \c flags.
//!
//! The Semantic of \c flags is not clear, must review the
//! code more closely.
//! \function void KatabaticEngine::slackenBlockIos ( Instance* core );
//! Perform a preventive break on horizontal segments in the GCell immediatly
//! \e outside the instance \c core area in the routing layer of index \c 1.
//!
//! \red{This method is too much hardwired to the \c SxLib gauge. It's effect is to break all \b METAL2 outside the core (in a chip).}
//! \function bool KatabaticEngine::moveUpNetTrunk ( AutoSegment* seed, set& globalNets, GCell::SetIndex& invalidateds );
//! \param seed The AutoSegment to take the net from.
//! \param globalNets The set of nets that has been moved up.
//! \param invalidateds The set of GCells that have been invalidated.
//! \sreturn \true if the net trunk have been moved up.
//!
//! Try to move up a whole net trunk. The net is supplied through the \c seed
//! argument (the segment that triggers the move). If the net is actually moved
//! up, it is added to \c globalNets and all GCells that have been invalidateds
//! are added to \c invalidateds.
//!
//! An individual AutoSegment of the net is moved up if it's length
//! is greater that \c 150 lambdas, that is, three times the side of a GCell. This is
//! hard-wired and should be parametrized in the future.
//! \function void KatabaticEngine::computeNetConstraints ( Net* net );
//! Compute the box constraints on AutoContacts (and therefore those applied to
//! AutoSegments). Constraints comes from AutoContacts anchoreds on RoutingPads
//! and transmitted through AutoContactHTee or AutoContactVTee. Constraints are
//! applied to all AutoContacts of an aligned set.
//!
//! \remark The \c net must have been canonized before this function to be called.
//! \function void KatabaticEngine::toOptimals ( Net* net );
//! Move all AutoSegment of \c net so that their axis are inside their
//! optimals interval. If a AutoSegment is already inside the interval is
//! not moved, otherwise it is put on the nearest bound of the optimal
//! interval.
}