// -*- 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. }