coriolis/kite/src/kite/KiteEngine.h

194 lines
9.5 KiB
C
Raw Normal View History

// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Header : "./KiteEngine.h" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#ifndef __KITE_KITE_ENGINE__
#define __KITE_KITE_ENGINE__
#include "hurricane/Name.h"
namespace Hurricane {
class Layer;
class Net;
class Cell;
}
#include "crlcore/RoutingGauge.h"
#include "katabatic/KatabaticEngine.h"
namespace Knik {
class KnikEngine;
}
#include "kite/TrackElement.h"
#include "kite/Configuration.h"
namespace Kite {
using Hurricane::Name;
using Hurricane::Layer;
using Hurricane::Net;
using Hurricane::Cell;
using CRL::RoutingGauge;
using Katabatic::KatabaticEngine;
class GCellGrid;
class Track;
class RoutingPlane;
class NegociateWindow;
// -------------------------------------------------------------------
// Enumerations
enum GlobalFlags { BuildGlobalSolution=1, LoadGlobalSolution };
// -------------------------------------------------------------------
// Class : "Kite::KiteEngine".
class KiteEngine : public KatabaticEngine {
public:
enum LookupFlags { OnAllCollapseds=1 };
public:
static const Name& staticGetName ();
static KiteEngine* create ( const RoutingGauge*, Cell* );
static KiteEngine* get ( const Cell* );
public:
inline KatabaticEngine* base ();
inline Configuration* getKiteConfiguration ();
inline Net* getBlockageNet ();
virtual Configuration* getConfiguration ();
inline bool getToolSuccess () const;
inline unsigned int getRipupLimit ( unsigned int type ) const;
unsigned int getRipupLimit ( const TrackElement* ) const;
inline unsigned int getRipupCost () const;
inline float getExpandStep () const;
inline float getEdgeCapacityPercent () const;
inline GCellGrid* getGCellGrid () 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;
void printCompletion () const;
inline void setPostEventCb ( Configuration::PostEventCb_t );
inline void setMinimumWL ( double );
inline void setRipupLimit ( unsigned int, unsigned int type );
inline void setRipupCost ( unsigned int );
inline void setExpandStep ( float );
inline void setEdgeCapacityPercent ( float );
void preProcess ();
void buildBlockages ();
void buildPowerRails ();
void createGlobalGraph ( unsigned int mode );
virtual void createDetailedGrid ();
void saveGlobalSolution ();
void annotateGlobalGraph ();
void runGlobalRouter ( unsigned int mode );
virtual void loadGlobalRouting ( unsigned int method, vector<Net*>& );
void runNegociate ( unsigned int slowMotion=0 );
void setInterrupt ( bool );
virtual void finalizeLayout ();
void _gutKite ();
inline TrackElementLut& _getTrackElementLut ();
void _link ( TrackElement* );
void _unlink ( TrackElement* );
TrackElement* _lookup ( Segment* ) const;
inline TrackElement* _lookup ( AutoSegment* ) const;
bool _check ( unsigned int& overlap, const char* message=NULL ) const;
void _check ( Net* ) const;
void _computeCagedConstraints ();
void _computeCagedConstraints ( Net* );
virtual Record* _getRecord () const;
virtual string _getString () const;
virtual string _getTypeName () const;
private:
// Attributes.
static Name _toolName;
protected:
Knik::KnikEngine* _knik;
Net* _obstacleNet;
Configuration _configuration;
vector<RoutingPlane*> _routingPlanes;
GCellGrid* _kiteGrid;
NegociateWindow* _negociateWindow;
TrackElementLut _trackSegmentLut;
double _minimumWL;
mutable bool _toolSuccess;
protected:
// Constructors & Destructors.
KiteEngine ( const RoutingGauge*, Cell* );
virtual ~KiteEngine ();
virtual void _postCreate ();
virtual void _preDestroy ();
private:
KiteEngine ( const KiteEngine& );
KiteEngine& operator= ( const KiteEngine& );
};
// Inline Functions.
inline KatabaticEngine* KiteEngine::base () { return static_cast<KatabaticEngine*>(this); }
inline Configuration* KiteEngine::getKiteConfiguration () { return &_configuration; }
inline Net* KiteEngine::getBlockageNet () { return _obstacleNet; }
inline Configuration::PostEventCb_t& KiteEngine::getPostEventCb () { return _configuration.getPostEventCb(); }
inline bool KiteEngine::getToolSuccess () const { return _toolSuccess; }
inline unsigned int KiteEngine::getRipupCost () const { return _configuration.getRipupCost(); }
inline float KiteEngine::getExpandStep () const { return _configuration.getExpandStep(); }
inline float KiteEngine::getEdgeCapacityPercent () const { return _configuration.getEdgeCapacityPercent(); }
inline unsigned int KiteEngine::getRipupLimit ( unsigned int type ) const { return _configuration.getRipupLimit(type); }
inline GCellGrid* KiteEngine::getGCellGrid () const { return _kiteGrid; }
inline NegociateWindow* KiteEngine::getNegociateWindow () { return _negociateWindow; }
inline size_t KiteEngine::getRoutingPlanesSize () const { return _routingPlanes.size(); }
inline void KiteEngine::setRipupLimit ( unsigned int limit, unsigned int type ) { _configuration.setRipupLimit(limit,type); }
inline void KiteEngine::setRipupCost ( unsigned int cost ) { _configuration.setRipupCost(cost); }
inline void KiteEngine::setExpandStep ( float step ) { _configuration.setExpandStep(step); }
inline void KiteEngine::setEdgeCapacityPercent ( float percent ) { _configuration.setEdgeCapacityPercent(percent); }
inline void KiteEngine::setMinimumWL ( double minimum ) { _minimumWL = minimum; }
inline void KiteEngine::setPostEventCb ( Configuration::PostEventCb_t cb ) { _configuration.setPostEventCb(cb); }
inline TrackElementLut& KiteEngine::_getTrackElementLut () { return _trackSegmentLut; }
inline TrackElement* KiteEngine::_lookup ( AutoSegment* as ) const { return _lookup(as->base()); }
// Variables.
extern const char* missingRW;
} // End of Kite namespace.
INSPECTOR_P_SUPPORT(Kite::KiteEngine);
#endif // __KITE_KITE_ENGINE__