Clarify semantic of flatten Collections (walkthrough).
In the Cell/Instance hierarchy, the "terminal" and "leaf cell" concepts where not clearly defined and partially overlapping. Now, "Terminal" is the refer to the physical hierarchy (layout) and "TerminalNetlist" to the logical hierarchy (netlist). The logical hierarchy can be less deep than the physical one thanks to a Cell dedicated cell flags. Collections related to the physical hierarchy keep their old names, the one related to the logical hierarchy are renamed from "Leaf" to "TerminalNetlist". The name "Leaf" was too ambiguous (leaf for *what* hierarchy). * Change: In Hurricane::Device, set the "TerminalNetlist" flag once and for all. No need set it in all the derived classes again. * New: In Hurricane::MultiCapacitor, added new parameter "dummy" to create dummies around the capacity matrix. * Change: In Hurricane::Cell, remove "Leaf" related methods, replace them by "TerminalNetlist" one, especially Collections. Now we have two clear sets of Collections to walkthough the layout or the netlist. Change the "Terminal" flag into "TerminalNetlist". * Change: In Hurricane::CellCollections, rename "Leaf" into "TerminalNetlist" collections and apply the new semantic to the locators. * Change: In Hurricane::DataBase, Leaf to TerminalInstance renaming. * Change: In Hurricane::DeepNet, Leaf to TerminalInstance renaming. * Change: In Hurricane::HyperNet, Leaf to TerminalInstance renaming. * Change: In Hurricane::Instance, Leaf to TerminalInstance renaming. * Change: In Hurricane::Viewer::HierarchyInformations, Leaf to TerminalInstance renaming. * Change: In CRL::AllianceFramework, Leaf to TerminalInstance renaming. * Change: In CRL::Catalog, Leaf to TerminalInstance renaming. * Change: In CRL::ApParser, Leaf to TerminalInstance renaming. * Change: In EtesianEngine::AddFeeds, Leaf to TerminalInstance renaming. * Bug: In EtesianEngine::resetPlacement, move there the loop over non terminal netlist instances to flag fully placed sub-blocks as terminal for the netlist. Only then remove the feed cells from unplaced instances. Previously, the feed cells where stripped even from already placed instances. * Change: In Katana, Leaf to TerminalInstance renaming. * Bug: In Bora::PyDSlicingNode, allow the range parameter to be the Python None object when we do not want to pass one but need to have it as positional parameter. * Change: In Cumulus/clocktree/ClockTree.py, Leaf to TerminalInstance renaming.
This commit is contained in:
parent
e2d6929fbe
commit
dfe4d80b60
|
@ -74,7 +74,8 @@ extern "C" {
|
|||
PyErr_SetString( ConstructorError, "DSlicingNode.create(): Second argument *must* be of type Cell." );
|
||||
return NULL;
|
||||
}
|
||||
if ( not IsPyStepParameterRange(pyParameterRange)
|
||||
if ( (pyParameterRange != Py_None)
|
||||
and not IsPyStepParameterRange(pyParameterRange)
|
||||
and not IsPyMatrixParameterRange(pyParameterRange)) {
|
||||
PyErr_SetString( ConstructorError, "DSlicingNode.create(): Third argument *must* be of type StepParameterRange or MatrixParameterRange." );
|
||||
return NULL;
|
||||
|
|
|
@ -113,6 +113,7 @@ extern "C" {
|
|||
# if !defined(__PYTHON_MODULE__)
|
||||
|
||||
ParameterRange* ParameterRangeCast ( PyObject* derivedObject ) {
|
||||
if (not derivedObject or (derivedObject == Py_None)) return NULL;
|
||||
if (IsPyStepParameterRange (derivedObject)) return PYSTEPPARAMETERRANGE_O (derivedObject);
|
||||
if (IsPyMatrixParameterRange(derivedObject)) return PYMATRIXPARAMETERRANGE_O(derivedObject);
|
||||
|
||||
|
|
|
@ -354,7 +354,7 @@ namespace CRL {
|
|||
// The cell is not even in the Catalog : add an entry.
|
||||
if (state == NULL) state = _catalog.getState( name, true );
|
||||
|
||||
if (state->isFlattenLeaf()) depth = 0;
|
||||
if (state->isTerminalNetlist()) depth = 0;
|
||||
state->setDepth( depth );
|
||||
|
||||
// Do not try to load.
|
||||
|
@ -380,7 +380,7 @@ namespace CRL {
|
|||
if (state->getCell() == NULL) {
|
||||
state->setCell ( Cell::create( _libraries[ _environment.getLIBRARIES().getIndex() ]->getLibrary() , name ) );
|
||||
state->getCell ()->put( CatalogProperty::create(state) );
|
||||
state->getCell ()->setFlattenLeaf( false );
|
||||
state->getCell ()->setTerminalNetlist( false );
|
||||
createCell = true;
|
||||
}
|
||||
|
||||
|
@ -526,7 +526,7 @@ namespace CRL {
|
|||
|
||||
state->setCell ( Cell::create ( library->getLibrary() , name ) );
|
||||
state->getCell ()->put ( CatalogProperty::create(state) );
|
||||
state->getCell ()->setFlattenLeaf ( false );
|
||||
state->getCell ()->setTerminalNetlist ( false );
|
||||
}
|
||||
|
||||
return state->getCell ();
|
||||
|
|
|
@ -76,12 +76,12 @@ namespace CRL {
|
|||
{
|
||||
string s;
|
||||
|
||||
s += (isFlattenLeaf()) ? 'C' : '-';
|
||||
s += (isFeed() ) ? 'F' : '-';
|
||||
s += (isPad() ) ? 'P' : '-';
|
||||
s += (isGds() ) ? 'G' : '-';
|
||||
s += (isDelete() ) ? 'D' : '-';
|
||||
s += (isInMemory() ) ? 'm' : '-';
|
||||
s += (isTerminalNetlist()) ? 'C' : '-';
|
||||
s += (isFeed() ) ? 'F' : '-';
|
||||
s += (isPad() ) ? 'P' : '-';
|
||||
s += (isGds() ) ? 'G' : '-';
|
||||
s += (isDelete() ) ? 'D' : '-';
|
||||
s += (isInMemory() ) ? 'm' : '-';
|
||||
|
||||
return s;
|
||||
}
|
||||
|
@ -163,12 +163,12 @@ namespace CRL {
|
|||
if (state->getLibrary() != library) state->setLibrary( library );
|
||||
|
||||
state->setDepth( depth );
|
||||
state->setFlattenLeaf( (sflags[0] == 'C') );
|
||||
state->setFeed( (sflags[1] == 'F') );
|
||||
state->setPad( (sflags[2] == 'P') );
|
||||
state->setGds( (sflags[3] == 'G') );
|
||||
state->setDelete( (sflags[4] == 'D') );
|
||||
state->setInMemory( (sflags[5] == 'm') );
|
||||
state->setTerminalNetlist( (sflags[0] == 'C') );
|
||||
state->setFeed( (sflags[1] == 'F') );
|
||||
state->setPad( (sflags[2] == 'P') );
|
||||
state->setGds( (sflags[3] == 'G') );
|
||||
state->setDelete( (sflags[4] == 'D') );
|
||||
state->setInMemory( (sflags[5] == 'm') );
|
||||
|
||||
update( stack, state );
|
||||
}
|
||||
|
@ -253,10 +253,10 @@ namespace CRL {
|
|||
|
||||
for ( ; start<s.size() ; start++ ) {
|
||||
switch ( s[start] ) {
|
||||
case 'C': state->setFlattenLeaf ( true ); break;
|
||||
case 'F': state->setFeed ( true ); break;
|
||||
case 'G': state->setGds ( true ); break;
|
||||
case 'D': state->setDelete ( true ); break;
|
||||
case 'C': state->setTerminalNetlist ( true ); break;
|
||||
case 'F': state->setFeed ( true ); break;
|
||||
case 'G': state->setGds ( true ); break;
|
||||
case 'D': state->setDelete ( true ); break;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
@ -303,9 +303,9 @@ namespace CRL {
|
|||
State* state = entry.second;
|
||||
if (state->getLibrary() != library) continue;
|
||||
|
||||
if (state->isFlattenLeaf()) of << setw(20) << left << entry.first << "C\n";
|
||||
if (state->isFeed() ) of << setw(20) << left << entry.first << "F\n";
|
||||
if (state->isGds() ) of << setw(20) << left << entry.first << "G\n";
|
||||
if (state->isTerminalNetlist()) of << setw(20) << left << entry.first << "C\n";
|
||||
if (state->isFeed() ) of << setw(20) << left << entry.first << "F\n";
|
||||
if (state->isGds() ) of << setw(20) << left << entry.first << "G\n";
|
||||
}
|
||||
of.close();
|
||||
}
|
||||
|
|
|
@ -348,7 +348,7 @@ namespace CRL {
|
|||
throw Error ( "Missing CatalogProperty in cell %s.\n" , getString(cell->getName()).c_str() );
|
||||
|
||||
__state._cell = cell;
|
||||
__state._cell->setTerminal ( false );
|
||||
__state._cell->setTerminalNetlist ( false );
|
||||
__state._state = sprop->getState();
|
||||
__state._state->setLogical ( true );
|
||||
|
||||
|
|
|
@ -397,49 +397,47 @@ void DumpDate(ofstream &ccell)
|
|||
}
|
||||
|
||||
|
||||
void DumpInstances(ofstream &ccell, Cell* cell)
|
||||
{
|
||||
for_each_instance(instance, cell->getNotUnplacedInstances())
|
||||
{
|
||||
void DumpInstances(ofstream &ccell, Cell* cell)
|
||||
{
|
||||
for ( Instance* instance : cell->getNotUnplacedInstances()) {
|
||||
ccell << "I " << toMBKlambda(instance->getAbutmentBox().getXMin())
|
||||
<< "," << toMBKlambda(instance->getAbutmentBox().getYMin())
|
||||
<< "," << instance->getMasterCell()->getName()
|
||||
<< "," << instance->getName()
|
||||
<< ",";
|
||||
|
||||
const Transformation& transformation = instance->getTransformation();
|
||||
switch (transformation.getOrientation()) {
|
||||
case Transformation::Orientation::ID:
|
||||
ccell << "NOSYM";
|
||||
break;
|
||||
case Transformation::Orientation::R1:
|
||||
ccell << "ROT_P";
|
||||
break;
|
||||
case Transformation::Orientation::R2:
|
||||
ccell << "SYMXY";
|
||||
break;
|
||||
case Transformation::Orientation::R3:
|
||||
ccell << "ROT_M";
|
||||
break;
|
||||
case Transformation::Orientation::MX:
|
||||
ccell << "SYM_X";
|
||||
break;
|
||||
case Transformation::Orientation::XR:
|
||||
ccell << "SY_RM";
|
||||
break;
|
||||
case Transformation::Orientation::MY:
|
||||
ccell << "SYM_Y";
|
||||
break;
|
||||
case Transformation::Orientation::YR:
|
||||
ccell << "SY_RP";
|
||||
break;
|
||||
default:
|
||||
throw Error("Unrecognized orientation in transformation");
|
||||
}
|
||||
ccell << endl;
|
||||
end_for;
|
||||
|
||||
const Transformation& transformation = instance->getTransformation();
|
||||
switch (transformation.getOrientation()) {
|
||||
case Transformation::Orientation::ID:
|
||||
ccell << "NOSYM";
|
||||
break;
|
||||
case Transformation::Orientation::R1:
|
||||
ccell << "ROT_P";
|
||||
break;
|
||||
case Transformation::Orientation::R2:
|
||||
ccell << "SYMXY";
|
||||
break;
|
||||
case Transformation::Orientation::R3:
|
||||
ccell << "ROT_M";
|
||||
break;
|
||||
case Transformation::Orientation::MX:
|
||||
ccell << "SYM_X";
|
||||
break;
|
||||
case Transformation::Orientation::XR:
|
||||
ccell << "SY_RM";
|
||||
break;
|
||||
case Transformation::Orientation::MY:
|
||||
ccell << "SYM_Y";
|
||||
break;
|
||||
case Transformation::Orientation::YR:
|
||||
ccell << "SY_RP";
|
||||
break;
|
||||
default:
|
||||
throw Error("Unrecognized orientation in transformation");
|
||||
}
|
||||
ccell << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -716,7 +716,7 @@ namespace {
|
|||
return;
|
||||
}
|
||||
|
||||
ignoreInstance = ignoreInstance and _cell->isTerminal();
|
||||
ignoreInstance = ignoreInstance and _cell->isTerminalNetlist();
|
||||
|
||||
instance = Instance::create( _cell
|
||||
, instanceName
|
||||
|
@ -729,7 +729,7 @@ namespace {
|
|||
, Instance::PlacementStatus::FIXED
|
||||
, true // Checking of recursive calls
|
||||
);
|
||||
_cell->setTerminal( ignoreInstance );
|
||||
_cell->setTerminalNetlist( ignoreInstance );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -781,7 +781,7 @@ namespace {
|
|||
|
||||
_state = catalogProperty->getState ();
|
||||
_state->setPhysical ( true );
|
||||
if ( _state->isFlattenLeaf() ) _cell->setFlattenLeaf ( true );
|
||||
if ( _state->isTerminalNetlist() ) _cell->setTerminalNetlist ( true );
|
||||
if ( _framework->isPad(_cell) ) _state->setPad ( true );
|
||||
|
||||
IoFile fileStream ( cellPath );
|
||||
|
|
|
@ -599,7 +599,7 @@ architecture_body
|
|||
: ARCHITECTURE
|
||||
simple_name
|
||||
{ if ( ( Vst::states->_behavioral )
|
||||
|| ( Vst::states->_state->isFlattenLeaf() )
|
||||
|| ( Vst::states->_state->isTerminalNetlist() )
|
||||
|| ( Vst::states->_state->getDepth() <= 0 )
|
||||
) YYACCEPT;
|
||||
}
|
||||
|
@ -785,7 +785,7 @@ component_instantiation_statement
|
|||
throw Error( message.str() );
|
||||
}
|
||||
Vst::states->_instance = Instance::create( Vst::states->_cell, *$1, Vst::states->_masterCell );
|
||||
Vst::states->_cell->setTerminal( false );
|
||||
Vst::states->_cell->setTerminalNetlist( false );
|
||||
} else {
|
||||
if (not Vst::framework->getCell(*$2,Catalog::State::Views|Catalog::State::InMemory)) {
|
||||
if (Vst::states->pushCell(*$2)) {
|
||||
|
|
|
@ -450,7 +450,7 @@ namespace {
|
|||
if (not _staticInit) staticInit();
|
||||
|
||||
_blifLut.insert( make_pair(getString(_cell->getName()), this) );
|
||||
if (_cell->isTerminal())
|
||||
if (_cell->isTerminalNetlist())
|
||||
_depth = 1;
|
||||
else {
|
||||
cmess2 << " " << tab++ << "+ " << cell->getName() << " [.model]" << endl;
|
||||
|
@ -770,7 +770,7 @@ namespace CRL {
|
|||
}
|
||||
|
||||
Cell* cell = framework->createCell( blifLine[1] );
|
||||
cell->setTerminal( false );
|
||||
cell->setTerminalNetlist( false );
|
||||
blifModel = new Model ( cell );
|
||||
|
||||
if (not mainModel or (blifLine[1] == mainName))
|
||||
|
|
|
@ -77,55 +77,55 @@ namespace CRL {
|
|||
class State {
|
||||
public:
|
||||
// Flags Constants.
|
||||
enum Flags { FlattenLeaf = 1 << 0
|
||||
, Feed = 1 << 1
|
||||
, Pad = 1 << 2
|
||||
, GDS = 1 << 3
|
||||
, Delete = 1 << 4
|
||||
, Logical = 1 << 5
|
||||
, Physical = 1 << 6
|
||||
, InMemory = 1 << 7
|
||||
, Foreign = 1 << 8
|
||||
, VstUseConcat = 1 << 9
|
||||
, Views = Physical|Logical
|
||||
enum Flags { TerminalNetlist = 1 << 0
|
||||
, Feed = 1 << 1
|
||||
, Pad = 1 << 2
|
||||
, GDS = 1 << 3
|
||||
, Delete = 1 << 4
|
||||
, Logical = 1 << 5
|
||||
, Physical = 1 << 6
|
||||
, InMemory = 1 << 7
|
||||
, Foreign = 1 << 8
|
||||
, VstUseConcat = 1 << 9
|
||||
, Views = Physical|Logical
|
||||
};
|
||||
// Constructors.
|
||||
inline State ();
|
||||
~State ();
|
||||
inline State ();
|
||||
~State ();
|
||||
// Predicates.
|
||||
inline bool isFlattenLeaf () const;
|
||||
inline bool isFeed () const;
|
||||
inline bool isPad () const;
|
||||
inline bool isGds () const;
|
||||
inline bool isDelete () const;
|
||||
inline bool isPhysical () const;
|
||||
inline bool isLogical () const;
|
||||
inline bool isInMemory () const;
|
||||
// Flags management.
|
||||
inline unsigned int getFlags ( unsigned int mask=(unsigned int)-1 ) const;
|
||||
inline bool setFlags ( unsigned int mask, bool value );
|
||||
inline bool setFlattenLeaf ( bool value );
|
||||
inline bool setFeed ( bool value );
|
||||
inline bool setPad ( bool value );
|
||||
inline bool setGds ( bool value );
|
||||
inline bool setDelete ( bool value );
|
||||
inline bool setPhysical ( bool value );
|
||||
inline bool setLogical ( bool value );
|
||||
inline bool setInMemory ( bool value );
|
||||
// Accessors.
|
||||
inline Cell* getCell () const;
|
||||
inline Library* getLibrary () const;
|
||||
inline unsigned int getDepth () const;
|
||||
// Modifiers.
|
||||
inline void merge ( const State& other );
|
||||
Cell* setCell ( Cell* cell );
|
||||
inline Library* setLibrary ( Library* library );
|
||||
inline void setDepth ( unsigned int depth );
|
||||
// Hurricane Management.
|
||||
void toJson ( JsonWriter* w ) const;
|
||||
inline string _getTypeName () const;
|
||||
string _getString () const;
|
||||
Record* _getRecord () const;
|
||||
inline bool isTerminalNetlist () const;
|
||||
inline bool isFeed () const;
|
||||
inline bool isPad () const;
|
||||
inline bool isGds () const;
|
||||
inline bool isDelete () const;
|
||||
inline bool isPhysical () const;
|
||||
inline bool isLogical () const;
|
||||
inline bool isInMemory () const;
|
||||
// Flags management.
|
||||
inline unsigned int getFlags ( unsigned int mask=(unsigned int)-1 ) const;
|
||||
inline bool setFlags ( unsigned int mask, bool value );
|
||||
inline bool setTerminalNetlist ( bool value );
|
||||
inline bool setFeed ( bool value );
|
||||
inline bool setPad ( bool value );
|
||||
inline bool setGds ( bool value );
|
||||
inline bool setDelete ( bool value );
|
||||
inline bool setPhysical ( bool value );
|
||||
inline bool setLogical ( bool value );
|
||||
inline bool setInMemory ( bool value );
|
||||
// Accessors.
|
||||
inline Cell* getCell () const;
|
||||
inline Library* getLibrary () const;
|
||||
inline unsigned int getDepth () const;
|
||||
// Modifiers.
|
||||
inline void merge ( const State& other );
|
||||
Cell* setCell ( Cell* cell );
|
||||
inline Library* setLibrary ( Library* library );
|
||||
inline void setDepth ( unsigned int depth );
|
||||
// Hurricane Management.
|
||||
void toJson ( JsonWriter* w ) const;
|
||||
inline string _getTypeName () const;
|
||||
string _getString () const;
|
||||
Record* _getRecord () const;
|
||||
|
||||
private:
|
||||
// Internal - Attributes.
|
||||
|
@ -203,44 +203,44 @@ namespace CRL {
|
|||
// -------------------------------------------------------------------
|
||||
// Inline Functions.
|
||||
|
||||
inline Catalog::State::State () : _flags(0), _depth(1), _cell(NULL), _library(NULL) { }
|
||||
inline bool Catalog::State::isFlattenLeaf () const { return (_flags&FlattenLeaf)?1:0; }
|
||||
inline bool Catalog::State::isFeed () const { return (_flags&Feed )?1:0; }
|
||||
inline bool Catalog::State::isPad () const { return (_flags&Pad )?1:0; }
|
||||
inline bool Catalog::State::isGds () const { return (_flags&GDS )?1:0; }
|
||||
inline bool Catalog::State::isDelete () const { return (_flags&Delete )?1:0; }
|
||||
inline bool Catalog::State::isPhysical () const { return (_flags&Physical )?1:0; }
|
||||
inline bool Catalog::State::isLogical () const { return (_flags&Logical )?1:0; }
|
||||
inline bool Catalog::State::isInMemory () const { return (_flags&InMemory )?1:0; }
|
||||
inline unsigned int Catalog::State::getFlags ( unsigned int mask ) const { return ( _flags & mask ); }
|
||||
inline bool Catalog::State::setFlags ( unsigned int mask, bool value ) {
|
||||
inline Catalog::State::State () : _flags(0), _depth(1), _cell(NULL), _library(NULL) { }
|
||||
inline bool Catalog::State::isTerminalNetlist () const { return (_flags&TerminalNetlist)?1:0; }
|
||||
inline bool Catalog::State::isFeed () const { return (_flags&Feed )?1:0; }
|
||||
inline bool Catalog::State::isPad () const { return (_flags&Pad )?1:0; }
|
||||
inline bool Catalog::State::isGds () const { return (_flags&GDS )?1:0; }
|
||||
inline bool Catalog::State::isDelete () const { return (_flags&Delete )?1:0; }
|
||||
inline bool Catalog::State::isPhysical () const { return (_flags&Physical )?1:0; }
|
||||
inline bool Catalog::State::isLogical () const { return (_flags&Logical )?1:0; }
|
||||
inline bool Catalog::State::isInMemory () const { return (_flags&InMemory )?1:0; }
|
||||
inline unsigned int Catalog::State::getFlags ( unsigned int mask ) const { return ( _flags & mask ); }
|
||||
inline bool Catalog::State::setFlags ( unsigned int mask, bool value ) {
|
||||
if (value) { _flags |= mask; }
|
||||
else { _flags &= ~mask; }
|
||||
return ((_flags&mask) ? true : false);
|
||||
}
|
||||
inline bool Catalog::State::setFlattenLeaf ( bool value ) { return setFlags(FlattenLeaf,value); }
|
||||
inline bool Catalog::State::setFeed ( bool value ) { return setFlags(Feed ,value); }
|
||||
inline bool Catalog::State::setPad ( bool value ) { return setFlags(Pad ,value); }
|
||||
inline bool Catalog::State::setGds ( bool value ) { return setFlags(GDS ,value); }
|
||||
inline bool Catalog::State::setDelete ( bool value ) { return setFlags(Delete ,value); }
|
||||
inline bool Catalog::State::setPhysical ( bool value ) { return setFlags(Physical ,value); }
|
||||
inline bool Catalog::State::setLogical ( bool value ) { return setFlags(Logical ,value); }
|
||||
inline bool Catalog::State::setInMemory ( bool value ) { return setFlags(InMemory ,value); }
|
||||
inline Library* Catalog::State::setLibrary ( Library* library ) { return _library = library; }
|
||||
inline void Catalog::State::setDepth ( unsigned int depth ) { _depth = depth; }
|
||||
inline Cell* Catalog::State::getCell () const { return _cell; }
|
||||
inline Library* Catalog::State::getLibrary () const { return _library; }
|
||||
inline unsigned int Catalog::State::getDepth () const { return _depth; }
|
||||
inline string Catalog::State::_getTypeName () const { return _TName("Catalog::State"); }
|
||||
|
||||
inline Catalog::Catalog () : _states() { }
|
||||
inline map<Name,Catalog::State*>*
|
||||
Catalog::getStates () { return &_states; }
|
||||
inline string Catalog::_getTypeName () const { return _TName("Catalog"); }
|
||||
|
||||
inline CatalogProperty::CatalogProperty ( Catalog::State* state ) : PrivateProperty(), _state(state) {}
|
||||
inline Catalog::State* CatalogProperty::getState () const { return _state; }
|
||||
inline void CatalogProperty::setState ( Catalog::State* state ) { _state = state; }
|
||||
inline bool Catalog::State::setTerminalNetlist ( bool value ) { return setFlags(TerminalNetlist,value); }
|
||||
inline bool Catalog::State::setFeed ( bool value ) { return setFlags(Feed ,value); }
|
||||
inline bool Catalog::State::setPad ( bool value ) { return setFlags(Pad ,value); }
|
||||
inline bool Catalog::State::setGds ( bool value ) { return setFlags(GDS ,value); }
|
||||
inline bool Catalog::State::setDelete ( bool value ) { return setFlags(Delete ,value); }
|
||||
inline bool Catalog::State::setPhysical ( bool value ) { return setFlags(Physical ,value); }
|
||||
inline bool Catalog::State::setLogical ( bool value ) { return setFlags(Logical ,value); }
|
||||
inline bool Catalog::State::setInMemory ( bool value ) { return setFlags(InMemory ,value); }
|
||||
inline Library* Catalog::State::setLibrary ( Library* library ) { return _library = library; }
|
||||
inline void Catalog::State::setDepth ( unsigned int depth ) { _depth = depth; }
|
||||
inline Cell* Catalog::State::getCell () const { return _cell; }
|
||||
inline Library* Catalog::State::getLibrary () const { return _library; }
|
||||
inline unsigned int Catalog::State::getDepth () const { return _depth; }
|
||||
inline string Catalog::State::_getTypeName () const { return _TName("Catalog::State"); }
|
||||
|
||||
inline Catalog::Catalog () : _states() { }
|
||||
inline map<Name,Catalog::State*>*
|
||||
Catalog::getStates () { return &_states; }
|
||||
inline string Catalog::_getTypeName () const { return _TName("Catalog"); }
|
||||
|
||||
inline CatalogProperty::CatalogProperty ( Catalog::State* state ) : PrivateProperty(), _state(state) {}
|
||||
inline Catalog::State* CatalogProperty::getState () const { return _state; }
|
||||
inline void CatalogProperty::setState ( Catalog::State* state ) { _state = state; }
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
|
@ -249,41 +249,41 @@ namespace CRL {
|
|||
|
||||
class CatalogExtension {
|
||||
public:
|
||||
static Catalog::State* get ( const Cell* );
|
||||
static Catalog::State* get ( const Cell* );
|
||||
public:
|
||||
static inline bool isFlattenLeaf ( const Cell* );
|
||||
static inline bool isFeed ( const Cell* );
|
||||
static inline bool isPad ( const Cell* );
|
||||
static inline bool isGds ( const Cell* );
|
||||
static inline bool isDelete ( const Cell* );
|
||||
static inline bool isPhysical ( const Cell* );
|
||||
static inline bool isLogical ( const Cell* );
|
||||
// Flags management.
|
||||
static inline unsigned int getFlags ( const Cell*, unsigned int mask=(unsigned int)-1 );
|
||||
static inline bool setFlags ( const Cell*, unsigned int mask, bool value );
|
||||
static inline bool setFlattenLeaf ( const Cell*, bool value );
|
||||
static inline bool setFeed ( const Cell*, bool value );
|
||||
static inline bool setPad ( const Cell*, bool value );
|
||||
static inline bool setGds ( const Cell*, bool value );
|
||||
static inline bool setDelete ( const Cell*, bool value );
|
||||
static inline bool setPhysical ( const Cell*, bool value );
|
||||
static inline bool setLogical ( const Cell*, bool value );
|
||||
// Accessors.
|
||||
static inline Library* getLibrary ( const Cell* );
|
||||
static inline unsigned int getDepth ( const Cell* );
|
||||
// Modifiers.
|
||||
static inline Library* setLibrary ( const Cell*, Library* library );
|
||||
static inline void setDepth ( const Cell*, unsigned int depth );
|
||||
static inline bool isTerminalNetlist ( const Cell* );
|
||||
static inline bool isFeed ( const Cell* );
|
||||
static inline bool isPad ( const Cell* );
|
||||
static inline bool isGds ( const Cell* );
|
||||
static inline bool isDelete ( const Cell* );
|
||||
static inline bool isPhysical ( const Cell* );
|
||||
static inline bool isLogical ( const Cell* );
|
||||
// Flags management.
|
||||
static inline unsigned int getFlags ( const Cell*, unsigned int mask=(unsigned int)-1 );
|
||||
static inline bool setFlags ( const Cell*, unsigned int mask, bool value );
|
||||
static inline bool setTerminalNetlist ( const Cell*, bool value );
|
||||
static inline bool setFeed ( const Cell*, bool value );
|
||||
static inline bool setPad ( const Cell*, bool value );
|
||||
static inline bool setGds ( const Cell*, bool value );
|
||||
static inline bool setDelete ( const Cell*, bool value );
|
||||
static inline bool setPhysical ( const Cell*, bool value );
|
||||
static inline bool setLogical ( const Cell*, bool value );
|
||||
// Accessors.
|
||||
static inline Library* getLibrary ( const Cell* );
|
||||
static inline unsigned int getDepth ( const Cell* );
|
||||
// Modifiers.
|
||||
static inline Library* setLibrary ( const Cell*, Library* library );
|
||||
static inline void setDepth ( const Cell*, unsigned int depth );
|
||||
private:
|
||||
static const Cell* _owner;
|
||||
static Catalog::State* _cache;
|
||||
};
|
||||
|
||||
|
||||
inline bool CatalogExtension::isFlattenLeaf ( const Cell* cell )
|
||||
inline bool CatalogExtension::isTerminalNetlist ( const Cell* cell )
|
||||
{
|
||||
Catalog::State* state = get(cell);
|
||||
return (state == NULL) ? false : state->isFlattenLeaf();
|
||||
return (state == NULL) ? false : state->isTerminalNetlist();
|
||||
}
|
||||
|
||||
|
||||
|
@ -343,10 +343,10 @@ namespace CRL {
|
|||
}
|
||||
|
||||
|
||||
inline bool CatalogExtension::setFlattenLeaf ( const Cell* cell, bool value )
|
||||
inline bool CatalogExtension::setTerminalNetlist ( const Cell* cell, bool value )
|
||||
{
|
||||
Catalog::State* state = get(cell);
|
||||
return (state == NULL) ? false : state->setFlattenLeaf(value);
|
||||
return (state == NULL) ? false : state->setTerminalNetlist(value);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -518,10 +518,10 @@ namespace {
|
|||
status = defwNewLine ();
|
||||
CHECK_STATUS_CBK(status);
|
||||
|
||||
status = defwStartComponents ( cell->getLeafInstanceOccurrences().getSize() );
|
||||
status = defwStartComponents ( cell->getTerminalNetlistInstanceOccurrences().getSize() );
|
||||
CHECK_STATUS_CBK(status);
|
||||
|
||||
for ( Occurrence occurrence : cell->getLeafInstanceOccurrences() ) {
|
||||
for ( Occurrence occurrence : cell->getTerminalNetlistInstanceOccurrences() ) {
|
||||
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
|
||||
string insname = toDefName(occurrence.getCompactString());
|
||||
const char* source = NULL;
|
||||
|
|
|
@ -710,7 +710,7 @@ namespace CRL {
|
|||
if ( cell != NULL ) {
|
||||
libraryName = getString(cell->getName()) + "_export";
|
||||
|
||||
for ( Occurrence occurrence : cell->getLeafInstanceOccurrences() ) {
|
||||
for ( Occurrence occurrence : cell->getTerminalNetlistInstanceOccurrences() ) {
|
||||
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
|
||||
cells.insert ( instance->getMasterCell() );
|
||||
}
|
||||
|
|
|
@ -186,7 +186,7 @@ namespace {
|
|||
hCell = Cell::create(library, Name(cellNameString));
|
||||
hCell->setTerminal(false);
|
||||
if (!asDesignLibrary)
|
||||
hCell->setFlattenLeaf(true);
|
||||
hCell->setTerminalNetlist(true);
|
||||
cerr << hCell << endl;
|
||||
if (asDesignLibrary)
|
||||
_cell2OACellMap[hCell] = cell;
|
||||
|
|
|
@ -401,7 +401,7 @@ void CSpiceParser::Parse(const string cellPath, Cell* cell)
|
|||
Catalog::State *state = sprop->getState ();
|
||||
state->setLogical ( true );
|
||||
|
||||
// if ( state->isFlattenLeaf() ) cell->setFlattenLeaf ( true );
|
||||
// if ( state->isTerminalNetlist() ) cell->setTerminalNetlist ( true );
|
||||
|
||||
if(badModelNameSet.find(getString(cell->getName()))!=badModelNameSet.end()) {
|
||||
state->setLogical (false);
|
||||
|
|
|
@ -356,7 +356,7 @@ CHyperNetDriverPortOccurrences::Locator::Locator(Occurrence hnrnoccurrence)
|
|||
if (hnrnoccurrence.getPath().isEmpty() and static_cast<Net*>(hnrnoccurrence.getEntity())->isExternal())
|
||||
_pinLocator = static_cast<Net*>(hnrnoccurrence.getEntity())->getPins().getSubSet(InputPin()).getLocator();
|
||||
|
||||
_plugOccurrenceLocator = HyperNet(hnrnoccurrence).getLeafPlugOccurrences().getSubSet(OutputPlugOccurrence()).getLocator();
|
||||
_plugOccurrenceLocator = HyperNet(hnrnoccurrence).getTerminalNetlistPlugOccurrences().getSubSet(OutputPlugOccurrence()).getLocator();
|
||||
}
|
||||
|
||||
CHyperNetDriverPortOccurrences::Locator::Locator(const Locator& locator)
|
||||
|
@ -491,7 +491,7 @@ CHyperNetReceiverPortOccurrences::Locator::Locator(Occurrence hnrnoccurrence)
|
|||
if (hnrnoccurrence.getPath().isEmpty() and static_cast<Net*>(hnrnoccurrence.getEntity())->isExternal())
|
||||
_pinLocator = static_cast<Net*>(hnrnoccurrence.getEntity())->getPins().getSubSet(OutputPin()).getLocator();
|
||||
|
||||
_plugOccurrenceLocator = HyperNet(hnrnoccurrence).getLeafPlugOccurrences().getSubSet(InputPlugOccurrence()).getLocator();
|
||||
_plugOccurrenceLocator = HyperNet(hnrnoccurrence).getTerminalNetlistPlugOccurrences().getSubSet(InputPlugOccurrence()).getLocator();
|
||||
}
|
||||
|
||||
CHyperNetReceiverPortOccurrences::Locator::Locator(const Locator& locator)
|
||||
|
|
|
@ -66,7 +66,7 @@ void createRoutingPadsRing(Cell* top_cell)
|
|||
//getting the net occurrence relative to its cell (null Path)
|
||||
//in order to have plug occurrences relative to the RoutingPads-to-be
|
||||
netOccurrence = Occurrence(net);
|
||||
for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getLeafPlugOccurrences() )
|
||||
for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getTerminalNetlistPlugOccurrences() )
|
||||
{
|
||||
//ltrace(58) << "Creating Routing Pad " << plugOccurrence << endl;ltracein(58);
|
||||
RoutingPad::create ( net, plugOccurrence );
|
||||
|
@ -130,7 +130,7 @@ void createRoutingPadsAndPinsRing ( Cell* top_cell )
|
|||
//getting the net occurrence relative to its cell (null Path)
|
||||
//in order to have plug occurrences relative to the RoutingPads-to-be
|
||||
netOccurrence = Occurrence(net);
|
||||
for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getLeafPlugOccurrences() )
|
||||
for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getTerminalNetlistPlugOccurrences() )
|
||||
{
|
||||
//ltrace(58) << "Creating Routing Pad " << plugOccurrence << endl;ltracein(58);
|
||||
RoutingPad::create ( net, plugOccurrence );
|
||||
|
@ -206,7 +206,7 @@ void createPlacedRoutingPadsAndPinsRing ( Cell* top_cell )
|
|||
//getting the net occurrence relative to its cell (null Path)
|
||||
//in order to have plug occurrences relative to the RoutingPads-to-be
|
||||
netOccurrence = Occurrence(net);
|
||||
for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getLeafPlugOccurrences() )
|
||||
for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getTerminalNetlistPlugOccurrences() )
|
||||
{
|
||||
cdebug_log(109,1) << "Creating Routing Pad " << plugOccurrence << endl;
|
||||
cerr << RoutingPad::create ( net, plugOccurrence, RoutingPad::BiggestArea ) << endl;
|
||||
|
|
|
@ -59,19 +59,19 @@ extern "C" {
|
|||
|
||||
|
||||
// Standart Accessors (Attributes).
|
||||
DirectGetBoolAttribute(PyCatalogState_isFlattenLeaf,isFlattenLeaf,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isFeed ,isFeed ,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isGds ,isGds ,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isDelete ,isDelete ,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isPhysical ,isPhysical ,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isLogical ,isFlattenLeaf,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isTerminalNetlist,isTerminalNetlist,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isFeed ,isFeed ,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isGds ,isGds ,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isDelete ,isDelete ,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isPhysical ,isPhysical ,PyCatalogState,Catalog::State)
|
||||
DirectGetBoolAttribute(PyCatalogState_isLogical ,isLogical ,PyCatalogState,Catalog::State)
|
||||
|
||||
DirectSetBoolAttribute(PyCatalogState_setFlattenLeaf,setFlattenLeaf,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setFeed ,setFeed ,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setGds ,setGds ,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setDelete ,setDelete ,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setPhysical ,setPhysical ,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setLogical ,setFlattenLeaf,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setTerminalNetlist,setTerminalNetlist,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setFeed ,setFeed ,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setGds ,setGds ,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setDelete ,setDelete ,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setPhysical ,setPhysical ,PyCatalogState,Catalog::State)
|
||||
DirectSetBoolAttribute(PyCatalogState_setLogical ,setLogical ,PyCatalogState,Catalog::State)
|
||||
|
||||
|
||||
// Standart Destroy (Attribute).
|
||||
|
@ -79,31 +79,31 @@ extern "C" {
|
|||
|
||||
|
||||
PyMethodDef PyCatalogState_Methods[] =
|
||||
{ { "isFlattenLeaf" , (PyCFunction)PyCatalogState_isFlattenLeaf, METH_NOARGS
|
||||
, "Return true if the Cell must not be explored for hierarchy." }
|
||||
, { "isFeed" , (PyCFunction)PyCatalogState_isFeed, METH_NOARGS
|
||||
, "Return true if the Cell is a feed through." }
|
||||
, { "isGds" , (PyCFunction)PyCatalogState_isGds, METH_NOARGS
|
||||
, "Return true if the Cell is a GDSII import." }
|
||||
, { "isDelete" , (PyCFunction)PyCatalogState_isDelete, METH_NOARGS
|
||||
, "Return true if the Cell has the Catalog Delete attribute." }
|
||||
, { "isPhysical" , (PyCFunction)PyCatalogState_isPhysical, METH_NOARGS
|
||||
, "Return true if the Cell possesses a physical (layout) view." }
|
||||
, { "isLogical" , (PyCFunction)PyCatalogState_isLogical, METH_NOARGS
|
||||
, "Return true if the Cell possesses a logical (netlist) view." }
|
||||
, { "setFlattenLeaf", (PyCFunction)PyCatalogState_setFlattenLeaf, METH_VARARGS
|
||||
, "Sets/reset the FlattenLeaf flag of a Cell." }
|
||||
, { "setFeed" , (PyCFunction)PyCatalogState_setFeed, METH_VARARGS
|
||||
, "Sets/reset the Feed flag of a Cell." }
|
||||
, { "setGds" , (PyCFunction)PyCatalogState_setGds, METH_VARARGS
|
||||
, "Sets/reset the Gds flag of a Cell." }
|
||||
, { "setDelete" , (PyCFunction)PyCatalogState_setDelete, METH_VARARGS
|
||||
, "Sets/reset the Delete flag of a Cell." }
|
||||
, { "setPhysical" , (PyCFunction)PyCatalogState_setPhysical, METH_VARARGS
|
||||
, "Sets/reset the Pysical flag of a Cell." }
|
||||
, { "setLogical" , (PyCFunction)PyCatalogState_setLogical, METH_VARARGS
|
||||
, "Sets/reset the Logical flag of a Cell." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
{ { "isTerminalNetlist" , (PyCFunction)PyCatalogState_isTerminalNetlist, METH_NOARGS
|
||||
, "Return true if the Cell must not be explored for hierarchy." }
|
||||
, { "isFeed" , (PyCFunction)PyCatalogState_isFeed, METH_NOARGS
|
||||
, "Return true if the Cell is a feed through." }
|
||||
, { "isGds" , (PyCFunction)PyCatalogState_isGds, METH_NOARGS
|
||||
, "Return true if the Cell is a GDSII import." }
|
||||
, { "isDelete" , (PyCFunction)PyCatalogState_isDelete, METH_NOARGS
|
||||
, "Return true if the Cell has the Catalog Delete attribute." }
|
||||
, { "isPhysical" , (PyCFunction)PyCatalogState_isPhysical, METH_NOARGS
|
||||
, "Return true if the Cell possesses a physical (layout) view." }
|
||||
, { "isLogical" , (PyCFunction)PyCatalogState_isLogical, METH_NOARGS
|
||||
, "Return true if the Cell possesses a logical (netlist) view." }
|
||||
, { "setTerminalNetlist", (PyCFunction)PyCatalogState_setTerminalNetlist, METH_VARARGS
|
||||
, "Sets/reset the TerminalNetlist flag of a Cell." }
|
||||
, { "setFeed" , (PyCFunction)PyCatalogState_setFeed, METH_VARARGS
|
||||
, "Sets/reset the Feed flag of a Cell." }
|
||||
, { "setGds" , (PyCFunction)PyCatalogState_setGds, METH_VARARGS
|
||||
, "Sets/reset the Gds flag of a Cell." }
|
||||
, { "setDelete" , (PyCFunction)PyCatalogState_setDelete, METH_VARARGS
|
||||
, "Sets/reset the Delete flag of a Cell." }
|
||||
, { "setPhysical" , (PyCFunction)PyCatalogState_setPhysical, METH_VARARGS
|
||||
, "Sets/reset the Pysical flag of a Cell." }
|
||||
, { "setLogical" , (PyCFunction)PyCatalogState_setLogical, METH_VARARGS
|
||||
, "Sets/reset the Logical flag of a Cell." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
||||
|
@ -137,16 +137,16 @@ extern "C" {
|
|||
{
|
||||
PyObject* constant;
|
||||
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::FlattenLeaf ,"FlattenLeaf");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Feed ,"Feed");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::GDS ,"GDS");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Delete ,"Delete");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Logical ,"Logical");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Physical ,"Physical");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::InMemory ,"InMemory");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Foreign ,"Foreign");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::VstUseConcat,"VstUseConcat");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Views ,"Views");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::TerminalNetlist ,"TerminalNetlist");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Feed ,"Feed");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::GDS ,"GDS");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Delete ,"Delete");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Logical ,"Logical");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Physical ,"Physical");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::InMemory ,"InMemory");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Foreign ,"Foreign");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::VstUseConcat ,"VstUseConcat");
|
||||
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Views ,"Views");
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -328,7 +328,7 @@ class HTree ( object ):
|
|||
|
||||
leafsByBuffer = {}
|
||||
hyperMasterClock = HyperNet.create( Occurrence(self.masterClock) )
|
||||
for plugOccurrence in hyperMasterClock.getLeafPlugOccurrences():
|
||||
for plugOccurrence in hyperMasterClock.getTerminalNetlistPlugOccurrences():
|
||||
trace( 550, '\tAdding leaf <%s>.\n' % plugOccurrence )
|
||||
position = plugOccurrence.getBoundingBox().getCenter()
|
||||
self.addLeaf( position, plugOccurrence )
|
||||
|
@ -591,7 +591,7 @@ def computeAbutmentBox ( cell, spaceMargin, aspectRatio, cellGauge ):
|
|||
#
|
||||
# instancesNb = 0
|
||||
# cellLength = 0
|
||||
# for occurrence in cell.getLeafInstanceOccurrences():
|
||||
# for occurrence in cell.getTerminalNetlistInstanceOccurrences():
|
||||
# instance = occurrence.getEntity()
|
||||
# instancesNb += 1
|
||||
# cellLength += int( DbU.toLambda(instance.getMasterCell().getAbutmentBox().getWidth()) )
|
||||
|
|
|
@ -32,7 +32,7 @@ and simulator, logic synthetiser, automatic place & route and portable |CMOS|
|
|||
library. It has been in used in research projects such as the 875K transistors
|
||||
|StaCS| superscalar microprocessor or the 400K transistors |IEEE| gigabit |HSL|
|
||||
router. It has been actively developped during the 1990-2000 years and is maintained
|
||||
since. It's practical limit for one standard cell block (flat) is about 10K gates,
|
||||
since. Its practical limit for one standard cell block (flat) is about 10K gates,
|
||||
above that limit you would need to use hierarchy and manually build a floorplan.
|
||||
|Alliance| is entirely written in C.
|
||||
|
||||
|
|
|
@ -360,9 +360,9 @@ arguments:
|
|||
|
||||
.. code-block:: sh
|
||||
|
||||
ego@home:debian-9> ../../dockerManage.sh -bS # build both system & coriolis images.
|
||||
ego@home:debian-9> ../../dockerManage.sh -r # compile & check coriolis.
|
||||
ego@home:debian-9> ../../dockerManage.sh -C # clear the images.
|
||||
ego@home:debian-9> ../../dockerManage.sh -scb # build system, coriolis & bash images.
|
||||
ego@home:debian-9> ../../dockerManage.sh -r # run the bash image.
|
||||
ego@home:debian-9> ../../dockerManage.sh --remove # clear all images.
|
||||
|
||||
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -52,6 +52,7 @@
|
|||
.. |SL6| replace:: :sc:`Scientific Linux 6`
|
||||
.. |SL7| replace:: :sc:`Scientific Linux 7`
|
||||
.. |Scientific Linux| replace:: :sc:`Scientific Linux`
|
||||
.. |CentOS| replace:: :sc:`CentOS`
|
||||
.. |RedHat| replace:: :sc:`RedHat`
|
||||
.. |Fedora| replace:: :sc:`Fedora`
|
||||
.. |FC13| replace:: :sc:`fc13`
|
||||
|
@ -62,9 +63,9 @@
|
|||
.. |Blif| replace:: :sc:`blif`
|
||||
.. |TSMC| replace:: :sc:`tsmc`
|
||||
.. |AMS| replace:: :sc:`ams`
|
||||
.. |XFAB| replace:: :sc:`xfab`
|
||||
.. |XH035| replace:: :cb:`XH035`
|
||||
.. |ROHM| replace:: :sc:`rohm`
|
||||
.. |XFAB| replace:: :sc:`xfab`
|
||||
.. |XH035| replace:: :cb:`XH035`
|
||||
.. |ROHM| replace:: :sc:`rohm`
|
||||
|
||||
.. |Alexandre| replace:: :sc:`Alexandre`
|
||||
.. |Belloeil| replace:: :sc:`Belloeil`
|
||||
|
@ -144,6 +145,12 @@
|
|||
.. |PyQt| replace:: :sc:`PyQt`
|
||||
.. |PyQt4| replace:: :sc:`PyQt4`
|
||||
.. |PyQt5| replace:: :sc:`PyQt5`
|
||||
.. |UID| replace:: :sc:`uid`
|
||||
.. |UID| replace:: :sc:`uid`
|
||||
.. |GID| replace:: :sc:`gid`
|
||||
.. |root| replace:: :cb:`root`
|
||||
.. |GID| replace:: :sc:`gid`
|
||||
.. |root| replace:: :cb:`root`
|
||||
.. |tty| replace:: :cb:`tty`
|
||||
.. |svn| replace:: :cb:`svn`
|
||||
.. |git| replace:: :cb:`git`
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item active" href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item active" href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,302 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Contents Installation in a chrooted Environment Setting up the chrooted root directory Configure schroot Installing Packages in Debian 9 Creating a Duplicate User Installation of Alliance / Coriolis ...">
|
||||
<meta name="keywords" content="">
|
||||
<link rel="icon" href="../favicon.ico">
|
||||
|
||||
<title>Install Cases - Coriolis VLSI CAD Tools [offline]</title>
|
||||
|
||||
<!-- Stylesheets -->
|
||||
<link href="../theme/css/bootstrap.css" rel="stylesheet">
|
||||
<link href="../theme/css/fonts.css" rel="stylesheet">
|
||||
<link href="../theme/css/nest.css" rel="stylesheet">
|
||||
<link href="../theme/css/pygment.css" rel="stylesheet">
|
||||
<link href="../theme/css/coriolis.css" rel="stylesheet">
|
||||
<!-- /Stylesheets -->
|
||||
|
||||
<script src="../theme/js/jquery.min.js"></script>
|
||||
<script src="../theme/js/bootstrap.min.js"></script>
|
||||
|
||||
<!-- RSS Feeds -->
|
||||
<!-- /RSS Feeds -->
|
||||
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
||||
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Header -->
|
||||
<div class="header-container" style="background: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), url('../images/common/layout-motif-faded-4.png'); background-position: center; ">
|
||||
|
||||
|
||||
<!--
|
||||
<div class="container">
|
||||
<nav class="navbar navbar-default">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="../"><img class="mr20" src="../images/common/Coriolis-logo-white-4-small.png" alt="logo">Coriolis VLSI CAD Tools [offline]</a>
|
||||
</div>
|
||||
<ul class="nav navbar-nav">
|
||||
<li><a href="../pages/gitlab.html">Git</a></li>
|
||||
<li><a href="../pages/documentation.html">Documentation</a></li>
|
||||
<li class="dropdown">
|
||||
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
|
||||
<span class="caret"></span>Topics
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item active" href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
</div> <!-- navbar container -->
|
||||
-->
|
||||
|
||||
<!-- Static navbar -->
|
||||
<div class="container">
|
||||
<div class="header-nav">
|
||||
<div class="header-logo">
|
||||
<a class="pull-left" href="../"><img class="mr20" src="../images/common/Coriolis-logo-white-4-small.png" alt="logo">Coriolis VLSI CAD Tools [offline]</a>
|
||||
</div>
|
||||
<div class="nav pull-right">
|
||||
<a href="../pages/gitlab.html">Git</a>
|
||||
<a href="../pages/documentation.html">Documentation</a>
|
||||
</div>
|
||||
<div class="nav pull-right">
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
|
||||
<span class="caret"></span>Topics
|
||||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item active" href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /Static navbar -->
|
||||
|
||||
<!-- Header -->
|
||||
<div class="container header-wrapper">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<div class="header-content">
|
||||
<a href="https://www.lip6.fr/"><img class="mr20" height="60px" src="../images/common/LogoLIP6Blanc.png" alt="LIP6"></a>
|
||||
<a href="https://www.sorbonne-universite.fr/"><img class="mr20" height="60px" src="../images/common/logo-SU-blanc-700px.png" alt="Sorbonne Universite"></a>
|
||||
<a href="https://www.cnrs.fr/"><img class="mr20" height="60px" src="../images/common/LOGO-cnrs-white-large.png" alt="CNRS"></a>
|
||||
<h1 class="header-title text-uppercase">Install Cases</h1>
|
||||
<div class="header-underline"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /Header -->
|
||||
|
||||
</div>
|
||||
<!-- /Header -->
|
||||
|
||||
|
||||
<!-- Content -->
|
||||
<div class="container content">
|
||||
<!-- -*- Mode: rst -*- -->
|
||||
<div class="contents topic" id="contents">
|
||||
<p class="topic-title first">Contents</p>
|
||||
<ul class="simple">
|
||||
<li><a class="reference internal" href="#installation-in-a-chrooted-environment" id="id2">Installation in a <em>chrooted</em> Environment</a><ul>
|
||||
<li><a class="reference internal" href="#setting-up-the-chrooted-root-directory" id="id3">Setting up the <em>chrooted</em> root directory</a></li>
|
||||
<li><a class="reference internal" href="#configure-schroot" id="id4">Configure <tt class="docutils literal">schroot</tt></a></li>
|
||||
<li><a class="reference internal" href="#installing-packages-in-debian-9" id="id5">Installing Packages in Debian 9</a></li>
|
||||
<li><a class="reference internal" href="#creating-a-duplicate-user" id="id6">Creating a Duplicate User</a></li>
|
||||
<li><a class="reference internal" href="#installation-of-alliance-coriolis" id="id7">Installation of <span class="sc">Alliance</span> / <span class="sc">Coriolis</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- -*- Mode: rst; explicit-buffer-name: "definition.rst<documentation/etc>" -*- -->
|
||||
<!-- HTML/LaTeX backends mixed macros. -->
|
||||
<!-- Acronyms & names. -->
|
||||
<!-- URLs -->
|
||||
<!-- Standard CAO/VLSI Concepts. -->
|
||||
<!-- Alliance & MBK Concepts -->
|
||||
<!-- Hurricane Concepts. -->
|
||||
<div class="section" id="installation-in-a-chrooted-environment">
|
||||
<h2><a class="toc-backref" href="#id2">Installation in a <em>chrooted</em> Environment</a></h2>
|
||||
<p>In this case, we will setup a Debian 9 installation of Alliance/Coriolis under
|
||||
a <span class="sc">Scientific Linux</span> 7 <span class="sc">os</span>. This should also work for <span class="sc">rhel</span> or <span class="sc">CentOS</span>.</p>
|
||||
<p>Debian 9 will be referred as the <em>guest OS</em> or the <em>chrooted</em>.
|
||||
<span class="sc">Scientific Linux</span> will be referred as the <em>host OS</em>.</p>
|
||||
<div class="section" id="setting-up-the-chrooted-root-directory">
|
||||
<h3><a class="toc-backref" href="#id3">Setting up the <em>chrooted</em> root directory</a></h3>
|
||||
<p>We need the <tt class="docutils literal">debootstrap</tt> and <tt class="docutils literal">schroot</tt> packages (from the <span class="sc">epel</span> repository).</p>
|
||||
<div class="highlight"><pre><span></span>root@pc:~# yum install debootstrap schroot
|
||||
</pre></div>
|
||||
<p>On the <strong>host</strong> <span class="sc">os</span>, as the <span class="cb">root</span> user, create the directory into which the
|
||||
whole <em>chrooted</em> <span class="sc">os</span> will reside:</p>
|
||||
<div class="highlight"><pre><span></span>root@pc:~# mkdir -p /home/chroot/debian9.coriolis
|
||||
root@pc:~# debootstrap stretch /home/chroot/debian9.coriolis http://ftp.us.debian.org/debian
|
||||
root@pc:~# <span class="nb">echo</span> <span class="s2">"debian9.coriolis"</span> > /home/chroot/debian9.coriolis/etc/debian_chroot
|
||||
</pre></div>
|
||||
<p>Then, we need to give access the <em>chrooted</em> distribution to some kernel filesystem
|
||||
of the host, namely <tt class="docutils literal">dev</tt>, <tt class="docutils literal">proc</tt>, <tt class="docutils literal">sys</tt> & <tt class="docutils literal">tmp</tt>. On the <em>host</em> filesytem,
|
||||
add to <tt class="docutils literal">/etc/fstab</tt>:</p>
|
||||
<div class="highlight"><pre><span></span># Your host normal mounts.
|
||||
# ...
|
||||
# For Jail chroot of Debian9.
|
||||
/dev /home/chroot/debian9.coriolis/dev none bind 0 0
|
||||
/dev/pts /home/chroot/debian9.coriolis/dev/pts none bind 0 0
|
||||
/proc /home/chroot/debian9.coriolis/proc none bind 0 0
|
||||
/sys /home/chroot/debian9.coriolis/sys none bind 0 0
|
||||
/tmp /home/chroot/debian9.coriolis/tmp none bind 0 0
|
||||
</pre></div>
|
||||
<p>Mount them:</p>
|
||||
<div class="highlight"><pre><span></span>root@pc:~# mount -a
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="section" id="configure-schroot">
|
||||
<h3><a class="toc-backref" href="#id4">Configure <tt class="docutils literal">schroot</tt></a></h3>
|
||||
<p>Edit <tt class="docutils literal">/etc/schroot.d/schroot.conf</tt> as follow:</p>
|
||||
<div class="highlight"><pre><span></span>[debian9.coriolis]
|
||||
description=Debian 9 stretch
|
||||
directory=/home/chroot/debian9.coriolis
|
||||
users=ego
|
||||
</pre></div>
|
||||
<div class="note">
|
||||
<p class="first admonition-title">Note</p>
|
||||
<p><strong>Users in the schrooted environment.</strong> They must exists on both the host
|
||||
system <strong>and</strong> in the chrooted one. It is best if they also have the same
|
||||
<span class="sc">uid</span> / <span class="sc">gid</span> and home directories (relative to their respectives root).
|
||||
For example, for a <tt class="docutils literal">ego</tt> user:</p>
|
||||
<table class="last table">
|
||||
<colgroup>
|
||||
<col width="57%" />
|
||||
<col width="43%" />
|
||||
</colgroup>
|
||||
<thead valign="bottom">
|
||||
<tr><th class="head">On the Host</th>
|
||||
<th class="head">In the <em>chrooted</em> <span class="sc">os</span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<tr><td><tt class="docutils literal">/home/ego</tt></td>
|
||||
<td>N/A</td>
|
||||
</tr>
|
||||
<tr><td><tt class="docutils literal">/home/chroot/debian9.coriolis/home/ego</tt></td>
|
||||
<td><tt class="docutils literal">/home/ego</tt></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="installing-packages-in-debian-9">
|
||||
<h3><a class="toc-backref" href="#id5">Installing Packages in Debian 9</a></h3>
|
||||
<p>Now that <tt class="docutils literal">schroot</tt> is set, we can log in the guest <span class="sc">os</span> as <tt class="docutils literal">root</tt> and add the
|
||||
minimal needed package set to build <span class="sc">Alliance</span> / <span class="sc">Coriolis</span>.</p>
|
||||
<div class="highlight"><pre><span></span>root@pc:~# schroot -c debian9.coriolis -u root
|
||||
<span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~# <span class="nb">export</span> <span class="nv">DEBIAN_FRONTEND</span><span class="o">=</span>noninteractive
|
||||
<span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~# apt-get update
|
||||
<span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~# apt-get -y install build-essential binutils-dev <span class="se">\</span>
|
||||
git cmake bison flex gcc python-dev <span class="se">\</span>
|
||||
libboost-all-dev libboost-python-dev <span class="se">\</span>
|
||||
zlib1g-dev libxml2-dev rapidjson-dev <span class="se">\</span>
|
||||
libbz2-dev <span class="se">\</span>
|
||||
qt4-dev-tools libqwt-dev python-qt4 <span class="se">\</span>
|
||||
autotools-dev automake <span class="se">\</span>
|
||||
libxt-dev libxpm-dev libmotif-dev <span class="se">\</span>
|
||||
yosys <span class="se">\</span>
|
||||
vim
|
||||
<span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~# apt-get clean
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="section" id="creating-a-duplicate-user">
|
||||
<h3><a class="toc-backref" href="#id6">Creating a Duplicate User</a></h3>
|
||||
<p>As stated before, we must create in the guest <span class="sc">os</span> a user that also exist on the
|
||||
host <span class="sc">os</span>, and with the same <span class="sc">uid</span> and home directory. Here we assume that <tt class="docutils literal">ego</tt>
|
||||
has an <span class="sc">uid</span> of 20000.</p>
|
||||
<div class="highlight"><pre><span></span><span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~# adduser --uid <span class="m">20000</span> ego
|
||||
Adding user <span class="sb">`</span>ego<span class="s1">' ...</span>
|
||||
<span class="s1"> Adding new group `ego'</span> <span class="o">(</span>20000<span class="o">)</span> ...
|
||||
Adding new user <span class="sb">`</span>ego<span class="s1">' (20000) with group `ego'</span> ...
|
||||
Creating home directory <span class="sb">`</span>/home/ego<span class="s1">' ...</span>
|
||||
<span class="s1"> Copying files from `/etc/skel'</span> ...
|
||||
Enter new UNIX password:
|
||||
Retype new UNIX password:
|
||||
passwd: password updated successfully
|
||||
Changing the user information <span class="k">for</span> ego
|
||||
Enter the new value, or press ENTER <span class="k">for</span> the default
|
||||
Full Name <span class="o">[]</span>: Me Myself and I
|
||||
Room Number <span class="o">[]</span>: 404
|
||||
Work Phone <span class="o">[]</span>: <span class="m">666</span> <span class="m">666</span> 666
|
||||
Home Phone <span class="o">[]</span>: 3615
|
||||
Other <span class="o">[]</span>:
|
||||
Is the information correct? <span class="o">[</span>Y/n<span class="o">]</span> Y
|
||||
<span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~#
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="section" id="installation-of-alliance-coriolis">
|
||||
<h3><a class="toc-backref" href="#id7">Installation of <span class="sc">Alliance</span> / <span class="sc">Coriolis</span></a></h3>
|
||||
<p>Download the installer script: <a class="reference external" href="../scripts/socInstaller.py">socInstaller.py</a>. And put it in the home
|
||||
directory of the user <tt class="docutils literal">ego</tt> in the guest <span class="sc">os</span>.</p>
|
||||
<div class="note">
|
||||
<p class="first admonition-title">Note</p>
|
||||
<p class="last">As it is more easier to download it from the host <span class="sc">os</span>, you may do
|
||||
so and just copy it under <tt class="docutils literal">/home/chroot/debian9.coriolis/home/ego</tt>.
|
||||
As they share the same <span class="sc">uid</span>, the copy is allowed.</p>
|
||||
</div>
|
||||
<p>Now we can connect as the <tt class="docutils literal">ego</tt> user on the guest <span class="sc">os</span>:</p>
|
||||
<div class="highlight"><pre><span></span>ego@pc:~> schroot -c debian9.coriolis -u ego
|
||||
<span class="o">(</span>debian9.coriolis<span class="o">)</span>jpc@pc:~> ./socInstaller.py --chroot --profile<span class="o">=</span>Debian9 <span class="se">\</span>
|
||||
--do-alliance --do-coriolis
|
||||
</pre></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- /Content -->
|
||||
|
||||
<!-- Footer -->
|
||||
<div class="footer gradient-2">
|
||||
<div class="container footer-container ">
|
||||
<div class="row">
|
||||
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-3">
|
||||
<div class="footer-title">Social</div>
|
||||
<ul class="list-unstyled">
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-2">
|
||||
</div>
|
||||
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-3">
|
||||
<div class="footer-title">Links</div>
|
||||
<ul class="list-unstyled">
|
||||
<li><a href="https://coriolis.lip6.fr/" target="_blank">Alliance/Coriolis</a></li>
|
||||
<li><a href="https://www-soc.lip6.fr/" target="_blank">CIAN Team Website</a></li>
|
||||
<li><a href="https://f-si.org" target="_blank">Free Silicon Foundation</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-3 col-md-3 col-lg-4">
|
||||
<p class="pull-right text-right">
|
||||
<small><em>Proudly powered by <a href="http://docs.getpelican.com/" target="_blank">pelican</a></em></small><br/>
|
||||
<small><em><span class="sc">NEST</span> theme by <a href="https://github.com/molivier" target="_blank">molivier</a></em></small><br/>
|
||||
<small>Copyright © 2020-2020 Sorbonne Universite</small>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /Footer -->
|
||||
</body>
|
||||
</html>
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item active" href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item active" href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -551,9 +553,9 @@ configuration file to see exactly how to setup a vanilla system to build
|
|||
<span class="sc">Coriolis</span>.</p>
|
||||
<p>To run the docker tests, call the <tt class="docutils literal">dockerManage.sh</tt> scripts with the relevant
|
||||
arguments:</p>
|
||||
<div class="highlight"><pre><span></span>ego@home:debian-9> ../../dockerManage.sh -bS <span class="c1"># build both system & coriolis images.</span>
|
||||
ego@home:debian-9> ../../dockerManage.sh -r <span class="c1"># compile & check coriolis.</span>
|
||||
ego@home:debian-9> ../../dockerManage.sh -C <span class="c1"># clear the images.</span>
|
||||
<div class="highlight"><pre><span></span>ego@home:debian-9> ../../dockerManage.sh -scb <span class="c1"># build system, coriolis & bash images.</span>
|
||||
ego@home:debian-9> ../../dockerManage.sh -r <span class="c1"># run the bash image.</span>
|
||||
ego@home:debian-9> ../../dockerManage.sh --remove <span class="c1"># clear all images.</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="section" id="packaging-coriolis">
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,631 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# -*- mode:Python -*-
|
||||
#
|
||||
# This file is part of the Coriolis Software.
|
||||
# Copyright (c) UPMC 2015-2018, All Rights Reserved
|
||||
#
|
||||
# +-----------------------------------------------------------------+
|
||||
# | C O R I O L I S |
|
||||
# | C o r i o l i s I n s t a l l e r |
|
||||
# | |
|
||||
# | Authors : Jean-Paul Chaput |
|
||||
# | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||
# | =============================================================== |
|
||||
# | Python : "./socInstaller.py" |
|
||||
# +-----------------------------------------------------------------+
|
||||
#
|
||||
# WARNING:
|
||||
# This script has been designed only for internal use in the
|
||||
# LIP6/CIAN department. If you want to use it you will need to
|
||||
# change the hardwired configuration.
|
||||
|
||||
|
||||
showTrace = True
|
||||
|
||||
try:
|
||||
import sys
|
||||
import os.path
|
||||
import shutil
|
||||
import optparse
|
||||
import time
|
||||
import traceback
|
||||
import distutils.sysconfig
|
||||
import subprocess
|
||||
import socket
|
||||
import re
|
||||
import bz2
|
||||
import smtplib
|
||||
from email.mime.text import MIMEText
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.application import MIMEApplication
|
||||
except ImportError, e:
|
||||
module = str(e).split()[-1]
|
||||
|
||||
|
||||
class ErrorMessage ( Exception ):
|
||||
|
||||
def __init__ ( self, code, *arguments ):
|
||||
self._code = code
|
||||
self._errors = [ 'Malformed call to ErrorMessage()', '%s' % str(arguments) ]
|
||||
|
||||
text = None
|
||||
if len(arguments) == 1:
|
||||
if isinstance(arguments[0],Exception): text = str(arguments[0]).split('\n')
|
||||
else:
|
||||
self._errors = arguments[0]
|
||||
elif len(arguments) > 1:
|
||||
text = list(arguments)
|
||||
|
||||
if text:
|
||||
self._errors = []
|
||||
while len(text[0]) == 0: del text[0]
|
||||
|
||||
lstrip = 0
|
||||
if text[0].startswith('[ERROR]'): lstrip = 8
|
||||
|
||||
for line in text:
|
||||
if line[0:lstrip ] == ' '*lstrip or \
|
||||
line[0:lstrip-1] == '[ERROR]':
|
||||
self._errors += [ line[lstrip:] ]
|
||||
else:
|
||||
self._errors += [ line.lstrip() ]
|
||||
return
|
||||
|
||||
def __str__ ( self ):
|
||||
if not isinstance(self._errors,list):
|
||||
return "[ERROR] %s" % self._errors
|
||||
|
||||
formatted = "\n"
|
||||
for i in range(len(self._errors)):
|
||||
if i == 0: formatted += "[ERROR] %s" % self._errors[i]
|
||||
else: formatted += " %s" % self._errors[i]
|
||||
if i+1 < len(self._errors): formatted += "\n"
|
||||
return formatted
|
||||
|
||||
def addMessage ( self, message ):
|
||||
if not isinstance(self._errors,list):
|
||||
self._errors = [ self._errors ]
|
||||
if isinstance(message,list):
|
||||
for line in message:
|
||||
self._errors += [ line ]
|
||||
else:
|
||||
self._errors += [ message ]
|
||||
return
|
||||
|
||||
def terminate ( self ):
|
||||
print self
|
||||
sys.exit(self._code)
|
||||
|
||||
@property
|
||||
def code ( self ): return self._code
|
||||
|
||||
|
||||
class BadBinary ( ErrorMessage ):
|
||||
|
||||
def __init__ ( self, binary ):
|
||||
ErrorMessage.__init__( self, 1, "Binary not found: <%s>." % binary )
|
||||
return
|
||||
|
||||
|
||||
class BadReturnCode ( ErrorMessage ):
|
||||
|
||||
def __init__ ( self, status ):
|
||||
ErrorMessage.__init__( self, 1, "Command returned status:%d." % status )
|
||||
return
|
||||
|
||||
|
||||
class Command ( object ):
|
||||
|
||||
def __init__ ( self, arguments, fdLog=None ):
|
||||
self.arguments = arguments
|
||||
self.fdLog = fdLog
|
||||
|
||||
if self.fdLog != None and not isinstance(self.fdLog,file):
|
||||
print '[WARNING] Command.__init__(): <fdLog> is neither None or a file.'
|
||||
return
|
||||
|
||||
def _argumentsToStr ( self, arguments ):
|
||||
s = ''
|
||||
for argument in arguments:
|
||||
if argument.find(' ') >= 0: s += ' "' + argument + '"'
|
||||
else: s += ' ' + argument
|
||||
return s
|
||||
|
||||
def log ( self, text ):
|
||||
print text[:-1]
|
||||
sys.stdout.flush()
|
||||
sys.stderr.flush()
|
||||
if isinstance(self.fdLog,file):
|
||||
self.fdLog.write( text )
|
||||
self.fdLog.flush()
|
||||
return
|
||||
|
||||
def execute ( self ):
|
||||
global conf
|
||||
sys.stdout.flush()
|
||||
sys.stderr.flush()
|
||||
|
||||
homeDir = os.environ['HOME']
|
||||
workDir = os.getcwd()
|
||||
if homeDir.startswith(homeDir):
|
||||
workDir = '~' + workDir[ len(homeDir) : ]
|
||||
user = 'root'
|
||||
if os.environ.has_key('USER'): user = os.environ['USER']
|
||||
prompt = '%s@%s:%s$' % (user,conf.masterHost,workDir)
|
||||
|
||||
try:
|
||||
self.log( '%s%s\n' % (prompt,self._argumentsToStr(self.arguments)) )
|
||||
print self.arguments
|
||||
child = subprocess.Popen( self.arguments, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
|
||||
|
||||
while True:
|
||||
line = child.stdout.readline()
|
||||
if not line: break
|
||||
|
||||
self.log( line )
|
||||
except OSError, e:
|
||||
raise BadBinary( self.arguments[0] )
|
||||
|
||||
(pid,status) = os.waitpid( child.pid, 0 )
|
||||
status >>= 8
|
||||
if status != 0:
|
||||
raise BadReturnCode( status )
|
||||
|
||||
return
|
||||
|
||||
|
||||
class CommandArg ( object ):
|
||||
|
||||
def __init__ ( self, command, wd=None, host=None, fdLog=None ):
|
||||
self.command = command
|
||||
self.host = host
|
||||
self.wd = wd
|
||||
self.fdLog = fdLog
|
||||
return
|
||||
|
||||
def __str__ ( self ):
|
||||
s = ''
|
||||
if self.wd: s = 'cd %s && ' % self.wd
|
||||
|
||||
for i in range(len(self.command)):
|
||||
if i: s += ' '
|
||||
s += self.command[i]
|
||||
return s
|
||||
|
||||
def getArgs ( self ):
|
||||
if not self.host: return self.command
|
||||
return [ 'ssh', self.host, str(self) ]
|
||||
|
||||
def execute ( self ):
|
||||
if not self.host and self.wd: os.chdir( self.wd )
|
||||
Command( self.getArgs(), self.fdLog ).execute()
|
||||
return
|
||||
|
||||
|
||||
class AllianceCommand ( CommandArg ):
|
||||
|
||||
def __init__ ( self, alcBin, fdLog=None ):
|
||||
CommandArg.__init__ ( self, [ alcBin ], fdLog=fdLog )
|
||||
return
|
||||
|
||||
|
||||
class CoriolisCommand ( CommandArg ):
|
||||
|
||||
def __init__ ( self, ccbBin, rootDir, threads=1, otherArgs=[], fdLog=None ):
|
||||
CommandArg.__init__ ( self, [ ccbBin
|
||||
, '--root='+rootDir
|
||||
, '--project=coriolis'
|
||||
, '--make=-j%d install' % threads
|
||||
] + otherArgs
|
||||
, fdLog=fdLog )
|
||||
return
|
||||
|
||||
|
||||
class BenchsCommand ( CommandArg ):
|
||||
|
||||
def __init__ ( self, benchsDir, fdLog=None ):
|
||||
CommandArg.__init__ ( self, [ '../bin/go.sh' ], wd=benchsDir, fdLog=fdLog )
|
||||
return
|
||||
|
||||
|
||||
|
||||
class GitRepository ( object ):
|
||||
|
||||
@staticmethod
|
||||
def getLocalRepository ( url ):
|
||||
localRepo = url.split( '/' )[-1]
|
||||
if localRepo.endswith('.git'):
|
||||
localRepo = localRepo[:-4]
|
||||
return localRepo
|
||||
|
||||
def __init__ ( self, url, cloneDir, fdLog=None ):
|
||||
self.url = url
|
||||
self.cloneDir = cloneDir
|
||||
self.localRepo = GitRepository.getLocalRepository( url )
|
||||
self.fdLog = fdLog
|
||||
return
|
||||
|
||||
@property
|
||||
def localRepoDir ( self ): return self.cloneDir+'/'+self.localRepo
|
||||
|
||||
def removeLocalRepo ( self ):
|
||||
if os.path.isdir(self.localRepoDir):
|
||||
print 'Removing Git local repository: <%s>' % self.localRepoDir
|
||||
shutil.rmtree( self.localRepoDir )
|
||||
return
|
||||
|
||||
def clone ( self ):
|
||||
print 'Clone/pull from:', self.url
|
||||
if not os.path.isdir(self.cloneDir):
|
||||
os.makedirs( self.cloneDir )
|
||||
|
||||
if not os.path.isdir(self.localRepoDir):
|
||||
os.chdir( self.cloneDir )
|
||||
Command( [ 'git', 'clone', self.url ], self.fdLog ).execute()
|
||||
else:
|
||||
os.chdir( self.localRepoDir )
|
||||
Command( [ 'git', 'pull' ], self.fdLog ).execute()
|
||||
return
|
||||
|
||||
def checkout ( self, branch ):
|
||||
os.chdir( self.localRepoDir )
|
||||
Command( [ 'git', 'checkout', branch ], self.fdLog ).execute()
|
||||
return
|
||||
|
||||
|
||||
class Configuration ( object ):
|
||||
|
||||
PrimaryNames = \
|
||||
[ 'sender' , 'receivers'
|
||||
, 'coriolisRepo', 'benchsRepo' , 'supportRepos'
|
||||
, 'homeDir' , 'masterHost'
|
||||
, 'debugArg' , 'nightlyMode', 'dockerMode', 'chrootMode'
|
||||
, 'rmSource' , 'rmBuild'
|
||||
, 'doGit' , 'doAlliance' , 'doCoriolis', 'doBenchs', 'doSendReport'
|
||||
, 'success' , 'rcode'
|
||||
]
|
||||
SecondaryNames = \
|
||||
[ 'rootDir', 'srcDir', 'logDir', 'logs', 'fds', 'alcBin', 'ccbBin', 'benchsDir'
|
||||
]
|
||||
|
||||
def __init__ ( self ):
|
||||
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
||||
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
||||
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
|
||||
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
|
||||
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
|
||||
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
|
||||
self._homeDir = os.environ['HOME']
|
||||
self._debugArg = ''
|
||||
self._rmSource = False
|
||||
self._rmBuild = False
|
||||
self._doGit = True
|
||||
self._doCoriolis = False
|
||||
self._doAlliance = False
|
||||
self._doBenchs = False
|
||||
self._doSendReport = False
|
||||
self._nightlyMode = False
|
||||
self._dockerMode = False
|
||||
self._chrootMode = None
|
||||
self._logs = { 'alliance':None, 'coriolis':None, 'benchs':None }
|
||||
self._fds = { 'alliance':None, 'coriolis':None, 'benchs':None }
|
||||
self._ccbBin = None
|
||||
self._benchsDir = None
|
||||
self._masterHost = self._detectMasterHost()
|
||||
self._success = False
|
||||
self._rcode = 0
|
||||
|
||||
self._updateSecondaries()
|
||||
return
|
||||
|
||||
def __setattr__ ( self, attribute, value ):
|
||||
if attribute in Configuration.SecondaryNames:
|
||||
print ErrorMessage( 1, 'Attempt to write in read-only attribute <%s> in Configuration.'%attribute )
|
||||
return
|
||||
|
||||
if attribute == 'masterHost' or attribute == '_masterHost':
|
||||
if value == 'lepka':
|
||||
print 'Never touch the Git tree when running on <lepka>.'
|
||||
self._rmSource = False
|
||||
self._rmBuild = False
|
||||
self._doGit = False
|
||||
self._doSendReport = False
|
||||
|
||||
if attribute[0] == '_':
|
||||
self.__dict__[attribute] = value
|
||||
return
|
||||
|
||||
if attribute == 'homeDir': value = os.path.expanduser(value)
|
||||
|
||||
self.__dict__['_'+attribute] = value
|
||||
self._updateSecondaries()
|
||||
return
|
||||
|
||||
def __getattr__ ( self, attribute ):
|
||||
if attribute[0] != '_': attribute = '_'+attribute
|
||||
if not self.__dict__.has_key(attribute):
|
||||
raise ErrorMessage( 1, 'Configuration has no attribute <%s>.'%attribute )
|
||||
return self.__dict__[attribute]
|
||||
|
||||
def _updateSecondaries ( self ):
|
||||
if self._nightlyMode:
|
||||
self._rootDir = self._homeDir + '/nightly/coriolis-2.x'
|
||||
else:
|
||||
self._rootDir = self._homeDir + '/coriolis-2.x'
|
||||
self._srcDir = self._rootDir + '/src'
|
||||
self._logDir = self._srcDir + '/logs'
|
||||
self._alcBin = self._srcDir + '/' + GitRepository.getLocalRepository(self._coriolisRepo) + '/bootstrap/allianceInstaller.sh'
|
||||
self._ccbBin = self._srcDir + '/' + GitRepository.getLocalRepository(self._coriolisRepo) + '/bootstrap/ccb.py'
|
||||
self._benchsDir = self._srcDir + '/' + GitRepository.getLocalRepository(self._benchsRepo ) + '/benchs'
|
||||
self._masterHost = self._detectMasterHost()
|
||||
return
|
||||
|
||||
def _detectMasterHost ( self ):
|
||||
if self._chrootMode is None: return 'unknown'
|
||||
if self._chrootMode: return 'chrooted-host'
|
||||
|
||||
masterHost = 'unknown'
|
||||
hostname = socket.gethostname()
|
||||
hostAddr = socket.gethostbyname(hostname)
|
||||
|
||||
if hostname == 'lepka' and hostAddr == '127.0.0.1':
|
||||
masterHost = 'lepka'
|
||||
else:
|
||||
masterHost = hostname.split('.')[0]
|
||||
return masterHost
|
||||
|
||||
def openLog ( self, stem ):
|
||||
if not os.path.isdir(self._logDir):
|
||||
os.makedirs( self._logDir )
|
||||
|
||||
index = 0
|
||||
timeTag = time.strftime( "%Y.%m.%d" )
|
||||
while True:
|
||||
logFile = os.path.join(self._logDir,"%s-%s-%02d.log" % (stem,timeTag,index))
|
||||
if not os.path.isfile(logFile):
|
||||
print "Report log: <%s>" % logFile
|
||||
break
|
||||
index += 1
|
||||
fd = open( logFile, "w" )
|
||||
self._logs[stem] = logFile
|
||||
self._fds [stem] = fd
|
||||
return
|
||||
|
||||
def closeLogs ( self ):
|
||||
for fd in self._fds.values():
|
||||
if fd: fd.close()
|
||||
return
|
||||
|
||||
def compressLogs ( self ):
|
||||
for log in self._logs.values():
|
||||
if not log: continue
|
||||
|
||||
fd = open( log, 'r' )
|
||||
bzfd = bz2.BZ2File( log+'.bz2', 'w' )
|
||||
|
||||
for line in fd.readlines(): bzfd.write( line )
|
||||
|
||||
bzfd.close()
|
||||
fd.close()
|
||||
|
||||
os.unlink( log )
|
||||
return
|
||||
|
||||
def getCommands ( self, target ):
|
||||
commands = []
|
||||
|
||||
if self.doAlliance:
|
||||
if not os.path.isfile( self.alcBin ):
|
||||
raise ErrorMessage( 1, [ 'Cannot find <allianceInstaller.sh>, should be here:'
|
||||
, ' <%s>' % self.alcBin
|
||||
] )
|
||||
commands.append( AllianceCommand( self.alcBin, fdLog=self.fds['alliance'] ) )
|
||||
|
||||
if self.doCoriolis:
|
||||
if not os.path.isfile( self.ccbBin ):
|
||||
raise ErrorMessage( 1, [ 'Cannot find <ccb.py>, should be here:'
|
||||
, ' <%s>' % self.ccbBin
|
||||
] )
|
||||
|
||||
otherArgs = []
|
||||
if self.debugArg: otherArgs.append( self.debugArg )
|
||||
|
||||
if target == 'SL7_64':
|
||||
otherArgs.append( '--project=support' )
|
||||
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 3, otherArgs , fdLog=self.fds['coriolis'] ) )
|
||||
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 1, otherArgs+['--doc'], fdLog=self.fds['coriolis'] ) )
|
||||
elif target == 'SL6_64' or target == 'SL6':
|
||||
otherArgs.append( '--project=support' )
|
||||
otherArgs.append( '--devtoolset=8' )
|
||||
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 6, otherArgs , fdLog=self.fds['coriolis'] ) )
|
||||
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 1, otherArgs+['--doc'], fdLog=self.fds['coriolis'] ) )
|
||||
elif target == 'Ubuntu18' or target == 'Debian9':
|
||||
if target == 'Ubuntu18': otherArgs.append( '--qt5' )
|
||||
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 3, otherArgs, fdLog=self.fds['coriolis'] ) )
|
||||
|
||||
if self.doBenchs:
|
||||
commands.append( BenchsCommand( self.benchsDir, fdLog=self.fds['benchs'] ) )
|
||||
return commands
|
||||
|
||||
|
||||
class Report ( object ):
|
||||
|
||||
def __init__ ( self, conf ):
|
||||
self.conf = conf
|
||||
|
||||
commaspace = ', '
|
||||
date = time.strftime( "%A %d %B %Y" )
|
||||
stateText = 'FAILED'
|
||||
modeText = 'SoC installation'
|
||||
if self.conf.success: stateText = 'SUCCESS'
|
||||
if self.conf.nightlyMode: modeText = 'Nightly build'
|
||||
|
||||
self.message = MIMEMultipart()
|
||||
self.message['Subject'] = '[%s] Coriolis %s %s' % (stateText,modeText,date)
|
||||
self.message['From' ] = self.conf.sender
|
||||
self.message['To' ] = commaspace.join( self.conf.receivers )
|
||||
self.attachements = []
|
||||
|
||||
self.mainText = '\n'
|
||||
self.mainText += 'Salut le Crevard,\n'
|
||||
self.mainText += '\n'
|
||||
if self.conf.nightlyMode:
|
||||
self.mainText += 'This is the nightly build report of Coriolis.\n'
|
||||
else:
|
||||
self.mainText += 'SoC installer report of Coriolis.\n'
|
||||
self.mainText += '%s\n' % date
|
||||
self.mainText += '\n'
|
||||
if self.conf.success:
|
||||
self.mainText += 'Build was SUCCESSFUL\n'
|
||||
else:
|
||||
self.mainText += 'Build has FAILED, please have a look to the attached log file(s).\n'
|
||||
self.mainText += '\n'
|
||||
self.mainText += 'Complete log file(s) can be found here:\n'
|
||||
return
|
||||
|
||||
def attachLog ( self, logFile ):
|
||||
if not logFile: return
|
||||
|
||||
fd = open( logFile, 'rb' )
|
||||
try:
|
||||
fd.seek( -1024*100, os.SEEK_END )
|
||||
except IOError, e:
|
||||
pass
|
||||
tailLines = ''
|
||||
for line in fd.readlines()[1:]:
|
||||
tailLines += line
|
||||
fd.close()
|
||||
self.mainText += ' <%s>\n' % logFile
|
||||
|
||||
attachement = MIMEApplication(tailLines)
|
||||
attachement.add_header( 'Content-Disposition', 'attachment', filename=os.path.basename(logFile) )
|
||||
|
||||
self.attachements.append( attachement )
|
||||
return
|
||||
|
||||
def send ( self ):
|
||||
self.message.attach( MIMEText(self.mainText) )
|
||||
for attachement in self.attachements:
|
||||
self.message.attach( attachement )
|
||||
|
||||
print "Sending mail report to:"
|
||||
for receiver in self.conf.receivers: print ' <%s>' % receiver
|
||||
session = smtplib.SMTP( 'localhost' )
|
||||
session.sendmail( self.conf.sender, self.conf.receivers, self.message.as_string() )
|
||||
session.quit()
|
||||
return
|
||||
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# <socInstaller> Main Part.
|
||||
|
||||
|
||||
parser = optparse.OptionParser ()
|
||||
parser.add_option ( "--debug" , action="store_true" , dest="debug" , help="Build a <Debug> aka (-g) version." )
|
||||
parser.add_option ( "--no-git" , action="store_true" , dest="noGit" , help="Do not pull/update Git repositories before building." )
|
||||
parser.add_option ( "--do-alliance" , action="store_true" , dest="doAlliance" , help="Rebuild the Alliance tools." )
|
||||
parser.add_option ( "--do-coriolis" , action="store_true" , dest="doCoriolis" , help="Rebuild the Coriolis tools." )
|
||||
parser.add_option ( "--do-report" , action="store_true" , dest="doReport" , help="Send a final report." )
|
||||
parser.add_option ( "--nightly" , action="store_true" , dest="nightly" , help="Perform a nighly build." )
|
||||
parser.add_option ( "--docker" , action="store_true" , dest="docker" , help="Perform a build inside a docker container." )
|
||||
parser.add_option ( "--chroot" , action="store_true" , dest="chroot" , help="Perform a build inside a chrooted environment." )
|
||||
parser.add_option ( "--benchs" , action="store_true" , dest="benchs" , help="Run the <alliance-checker-toolkit> sanity benchs." )
|
||||
parser.add_option ( "--rm-build" , action="store_true" , dest="rmBuild" , help="Remove the build/install directories." )
|
||||
parser.add_option ( "--rm-source" , action="store_true" , dest="rmSource" , help="Remove the Git source repositories." )
|
||||
parser.add_option ( "--rm-all" , action="store_true" , dest="rmAll" , help="Remove everything (source+build+install)." )
|
||||
parser.add_option ( "--root" , action="store" , type="string", dest="rootDir" , help="The root directory (default: <~/coriolis-2.x/>)." )
|
||||
parser.add_option ( "--profile" , action="store" , type="string", dest="profile" , help="The targeted OS for the build." )
|
||||
(options, args) = parser.parse_args ()
|
||||
|
||||
|
||||
conf = Configuration()
|
||||
|
||||
try:
|
||||
if options.debug: conf.debugArg = '--debug'
|
||||
if options.nightly: conf.nightlyMode = True
|
||||
if options.docker: conf.dockerMode = True
|
||||
if options.chroot: conf.chrootMode = True
|
||||
if options.noGit: conf.doGit = False
|
||||
if options.doCoriolis: conf.doCoriolis = True
|
||||
if options.doAlliance: conf.doAlliance = True
|
||||
if options.benchs: conf.doBenchs = True
|
||||
if options.doReport: conf.doSendReport = True
|
||||
if options.rmSource or options.rmAll: conf.rmSource = True
|
||||
if options.rmBuild or options.rmAll: conf.rmBuild = True
|
||||
|
||||
|
||||
if conf.doAlliance: conf.openLog( 'alliance' )
|
||||
if conf.doCoriolis: conf.openLog( 'coriolis' )
|
||||
if conf.doBenchs: conf.openLog( 'benchs' )
|
||||
|
||||
if conf.dockerMode: os.environ['USER'] = 'root'
|
||||
|
||||
gitSupports = []
|
||||
for supportRepo in conf.supportRepos:
|
||||
gitSupports.append( GitRepository( supportRepo, conf.srcDir+'/support' ) )
|
||||
gitCoriolis = GitRepository( conf.coriolisRepo, conf.srcDir, conf.fds['coriolis'] )
|
||||
gitBenchs = GitRepository( conf.benchsRepo , conf.srcDir, conf.fds['coriolis'] )
|
||||
|
||||
if conf.doAlliance:
|
||||
gitAlliance = GitRepository( conf.allianceRepo, conf.srcDir, conf.fds['alliance'] )
|
||||
|
||||
if conf.doGit:
|
||||
for gitSupport in gitSupports:
|
||||
if conf.rmSource: gitSupport.removeLocalRepo()
|
||||
gitSupport.clone()
|
||||
#if gitSupport.url.endswith('rapidjson'):
|
||||
# gitSupport.checkout( 'a1c4f32' )
|
||||
|
||||
if conf.doCoriolis:
|
||||
if conf.rmSource: gitCoriolis.removeLocalRepo()
|
||||
gitCoriolis.clone ()
|
||||
gitCoriolis.checkout( 'devel' )
|
||||
|
||||
if conf.doAlliance:
|
||||
if conf.rmSource: gitAlliance.removeLocalRepo()
|
||||
gitAlliance.clone ()
|
||||
#gitAlliance.checkout( 'devel' )
|
||||
|
||||
if conf.rmSource: gitBenchs.removeLocalRepo()
|
||||
gitBenchs.clone()
|
||||
|
||||
if conf.rmBuild:
|
||||
for entry in os.listdir(conf.rootDir):
|
||||
if entry.startswith('Linux.'):
|
||||
buildDir = conf.rootDir+'/'+entry
|
||||
print 'Removing OS build directory: <%s>' % buildDir
|
||||
shutil.rmtree( buildDir )
|
||||
|
||||
commands = conf.getCommands( options.profile )
|
||||
for command in commands:
|
||||
if command.host:
|
||||
print 'Executing command on remote host <%s>:' % host
|
||||
else:
|
||||
print 'Executing command on *local* host:'
|
||||
print ' %s' % str(command)
|
||||
command.execute()
|
||||
|
||||
conf.closeLogs()
|
||||
|
||||
conf.success = True
|
||||
|
||||
except ErrorMessage, e:
|
||||
print e
|
||||
conf.closeLogs()
|
||||
conf.success = False
|
||||
|
||||
if showTrace:
|
||||
print '\nPython stack trace:'
|
||||
traceback.print_tb( sys.exc_info()[2] )
|
||||
conf.rcode = e.code
|
||||
|
||||
if conf.doSendReport:
|
||||
report = Report( conf )
|
||||
report.attachLog( conf.logs['coriolis' ] )
|
||||
report.attachLog( conf.logs['benchs' ] )
|
||||
report.send()
|
||||
|
||||
conf.compressLogs()
|
||||
|
||||
sys.exit( conf.rcode )
|
|
@ -55,6 +55,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
|
@ -81,6 +82,7 @@
|
|||
</button>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
|
||||
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -30,6 +30,7 @@ STATIC_PATHS = [ 'pages/users-guide'
|
|||
, 'pages/python-cpp'
|
||||
, 'pages/stratus'
|
||||
, 'pages/rds'
|
||||
, 'scripts'
|
||||
, 'images'
|
||||
, 'pdfs'
|
||||
]
|
||||
|
|
|
@ -338,7 +338,7 @@ void EquinoxEngine::cleanUpLeafCell()
|
|||
// *************************************
|
||||
{
|
||||
|
||||
///*DEBUG*/ cmess1 << " - cleanUpLeafCell() " << endl;
|
||||
///*DEBUG*/ cmess1 << " - cleanUpTerminalNetlistCell() " << endl;
|
||||
set<Net*> set_nets;
|
||||
Net * externalnet = NULL;
|
||||
unsigned long count = 1;
|
||||
|
|
|
@ -69,7 +69,7 @@ namespace Equinox {
|
|||
bool IsRoutingFilter::accept (Equi* item) const
|
||||
{
|
||||
if(item->isLeafEqui()) {
|
||||
if( item->getCell()->isLeaf() ) {
|
||||
if( item->getCell()->isTerminalNetlist() ) {
|
||||
OccurrenceLocator locator = item->getNetOccurrences().getLocator();
|
||||
Net * net = dynamic_cast<Net*>(locator.getElement().getEntity());
|
||||
if(!(net->isExternal()))
|
||||
|
|
|
@ -241,7 +241,7 @@ namespace Equinox {
|
|||
void WithAlimStrategy::operationAfterScanLine(EquinoxEngine* equinox)
|
||||
{
|
||||
Cell * cell = equinox->_cell;
|
||||
if( cell->isLeaf()) // If this is a leaf cell
|
||||
if( cell->isTerminalNetlist()) // If this is a leaf cell
|
||||
equinox->cleanUpLeafCell();
|
||||
else
|
||||
equinox->getOccurrencesOfEquis();
|
||||
|
@ -318,7 +318,7 @@ namespace Equinox {
|
|||
|
||||
Occurrences componentoccurrences ;
|
||||
|
||||
if(equinox->_cell->isLeaf())
|
||||
if(equinox->_cell->isTerminalNetlist())
|
||||
componentoccurrences = equinox->_cell->getComponentOccurrencesUnder(underbox,
|
||||
DataBase::getDB()->getTechnology()->_getMetalMask()).getSubSet((WithAlimStrategyFilter()));
|
||||
else
|
||||
|
@ -430,7 +430,7 @@ namespace Equinox {
|
|||
void WithoutAlimStrategy::operationAfterScanLine(EquinoxEngine* equinox)
|
||||
{
|
||||
Cell * cell = equinox->_cell;
|
||||
if( cell->isLeaf()) // If this is a leaf cell
|
||||
if( cell->isTerminalNetlist()) // If this is a leaf cell
|
||||
equinox->cleanUpLeafCell();
|
||||
else
|
||||
equinox->getOccurrencesOfEquis();
|
||||
|
|
|
@ -311,7 +311,7 @@ namespace Etesian {
|
|||
Box topCellAb = getBlockCell()->getAbutmentBox();
|
||||
|
||||
if (not topCellAb.isEmpty()) {
|
||||
for ( Occurrence occurrence : getBlockCell()->getLeafInstanceOccurrences() )
|
||||
for ( Occurrence occurrence : getBlockCell()->getTerminalNetlistInstanceOccurrences() )
|
||||
{
|
||||
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
|
||||
Cell* masterCell = instance->getMasterCell();
|
||||
|
@ -370,9 +370,7 @@ namespace Etesian {
|
|||
|
||||
sliceHoles.setSpinSlice0( _yspinSlice0 );
|
||||
|
||||
Cell::setFlattenLeafMode( true );
|
||||
|
||||
for ( Occurrence occurrence : getBlockCell()->getLeafInstanceOccurrences() )
|
||||
for ( Occurrence occurrence : getBlockCell()->getTerminalNetlistInstanceOccurrences() )
|
||||
{
|
||||
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
|
||||
Cell* masterCell = instance->getMasterCell();
|
||||
|
@ -399,8 +397,6 @@ namespace Etesian {
|
|||
|
||||
sliceHoles.addFeeds();
|
||||
|
||||
Cell::setFlattenLeafMode( false );
|
||||
|
||||
UpdateSession::close();
|
||||
|
||||
if (_viewer) _viewer->getCellWidget()->refresh();
|
||||
|
|
|
@ -365,7 +365,7 @@ namespace Etesian {
|
|||
double cellLength = 0;
|
||||
|
||||
vector<Occurrence> feedOccurrences;
|
||||
for( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() )
|
||||
for( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences() )
|
||||
{
|
||||
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
|
||||
Cell* masterCell = instance->getMasterCell();
|
||||
|
@ -401,8 +401,8 @@ namespace Etesian {
|
|||
double columns = std::ceil( gcellLength / rows );
|
||||
|
||||
UpdateSession::open();
|
||||
for ( auto ioccurrence : feedOccurrences ) {
|
||||
static_cast<Instance*>(ioccurrence.getEntity())->destroy();
|
||||
for ( auto occurrence : feedOccurrences ) {
|
||||
static_cast<Instance*>(occurrence.getEntity())->destroy();
|
||||
}
|
||||
|
||||
DbU::Unit abWidth = columns*getSliceHeight();
|
||||
|
@ -430,18 +430,60 @@ namespace Etesian {
|
|||
|
||||
void EtesianEngine::resetPlacement ()
|
||||
{
|
||||
//cerr << "EtesianEngine::resetPlacement()" << endl;
|
||||
cmess1 << " o Erasing previous placement of <" << getCell()->getName() << ">" << endl;
|
||||
|
||||
_flatDesign = true;
|
||||
|
||||
Dots dots ( cmess2, " ", 80, 1000 );
|
||||
if (not cmess2.enabled()) dots.disable();
|
||||
|
||||
cmess1 << " o Erasing previous placement of <" << getCell()->getName() << ">" << endl;
|
||||
Box topAb = getBlockCell()->getAbutmentBox();
|
||||
Transformation topTransformation;
|
||||
if (getBlockInstance()) topTransformation = getBlockInstance()->getTransformation();
|
||||
topTransformation.applyOn( topAb );
|
||||
|
||||
UpdateSession::open();
|
||||
for ( Occurrence occurrence : getBlockCell()->getNonTerminalNetlistInstanceOccurrences() )
|
||||
{
|
||||
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
|
||||
Cell* masterCell = instance->getMasterCell();
|
||||
|
||||
if (not masterCell->getAbutmentBox().isEmpty()) {
|
||||
if ( (instance->getPlacementStatus() != Instance::PlacementStatus::PLACED)
|
||||
and (instance->getPlacementStatus() != Instance::PlacementStatus::FIXED ) ) {
|
||||
throw Error( "EtesianEngine::toColoquinte(): Non-leaf instance \"%s\" of \"%s\" has an abutment box but is *not* placed."
|
||||
, getString(instance ->getName()).c_str()
|
||||
, getString(masterCell->getName()).c_str()
|
||||
);
|
||||
} else {
|
||||
bool isFullyPlaced = true;
|
||||
for ( Instance* subInstance : masterCell->getInstances() ) {
|
||||
if ( (instance->getPlacementStatus() != Instance::PlacementStatus::PLACED)
|
||||
and (instance->getPlacementStatus() != Instance::PlacementStatus::FIXED ) ) {
|
||||
isFullyPlaced = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isFullyPlaced) {
|
||||
masterCell->setTerminalNetlist( true );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( masterCell->getAbutmentBox().isEmpty()
|
||||
or ( (masterCell->getAbutmentBox().getHeight() == topAb.getHeight())
|
||||
and (masterCell->getAbutmentBox().getWidth () == topAb.getWidth ()) ) ) {
|
||||
// Have to check here if the model is fully placed or not.
|
||||
//masterCell->setAbutmentBox( topAb );
|
||||
//instance->setTransformation( Transformation() ); // (0,0,ID).
|
||||
//instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
||||
occurrence.makeInvalid();
|
||||
instance->slaveAbutmentBox();
|
||||
}
|
||||
}
|
||||
|
||||
vector<Occurrence> feedOccurrences;
|
||||
for( Occurrence occurrence : getCell()->getLeafInstanceOccurrences(getBlockInstance()) )
|
||||
for( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) )
|
||||
{
|
||||
dots.dot();
|
||||
|
||||
|
@ -456,8 +498,8 @@ namespace Etesian {
|
|||
feedOccurrences.push_back( occurrence );
|
||||
}
|
||||
|
||||
for ( auto ioccurrence : feedOccurrences ) {
|
||||
Instance* instance = static_cast<Instance*>(ioccurrence.getEntity());
|
||||
for ( auto occurrence : feedOccurrences ) {
|
||||
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
|
||||
instance->destroy();
|
||||
}
|
||||
|
||||
|
@ -491,50 +533,7 @@ namespace Etesian {
|
|||
if (getBlockInstance()) topTransformation = getBlockInstance()->getTransformation();
|
||||
topTransformation.applyOn( topAb );
|
||||
|
||||
Cell::setFlattenLeafMode( true );
|
||||
|
||||
UpdateSession::open();
|
||||
for ( Occurrence occurrence : getBlockCell()->getNonLeafInstanceOccurrences() )
|
||||
{
|
||||
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
|
||||
Cell* masterCell = instance->getMasterCell();
|
||||
|
||||
if (not masterCell->getAbutmentBox().isEmpty()) {
|
||||
if ( (instance->getPlacementStatus() != Instance::PlacementStatus::PLACED)
|
||||
and (instance->getPlacementStatus() != Instance::PlacementStatus::FIXED ) ) {
|
||||
throw Error( "EtesianEngine::toColoquinte(): Non-leaf instance \"%s\" of \"%s\" has an abutment box but is *not* placed."
|
||||
, getString(instance ->getName()).c_str()
|
||||
, getString(masterCell->getName()).c_str()
|
||||
);
|
||||
} else {
|
||||
bool isFullyPlaced = true;
|
||||
for ( Instance* subInstance : masterCell->getInstances() ) {
|
||||
if ( (instance->getPlacementStatus() != Instance::PlacementStatus::PLACED)
|
||||
and (instance->getPlacementStatus() != Instance::PlacementStatus::FIXED ) ) {
|
||||
isFullyPlaced = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isFullyPlaced) {
|
||||
masterCell->setFlattenLeaf( true );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( masterCell->getAbutmentBox().isEmpty()
|
||||
or ( (masterCell->getAbutmentBox().getHeight() == topAb.getHeight())
|
||||
and (masterCell->getAbutmentBox().getWidth () == topAb.getWidth ()) ) ) {
|
||||
// Have to check here if the model is fully placed or not.
|
||||
//masterCell->setAbutmentBox( topAb );
|
||||
//instance->setTransformation( Transformation() ); // (0,0,ID).
|
||||
//instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
||||
occurrence.makeInvalid();
|
||||
instance->slaveAbutmentBox();
|
||||
}
|
||||
}
|
||||
UpdateSession::close();
|
||||
|
||||
size_t instancesNb = getCell()->getLeafInstanceOccurrences(getBlockInstance()).getSize();
|
||||
size_t instancesNb = getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()).getSize();
|
||||
if (not instancesNb) {
|
||||
cerr << Error( "EtesianEngine::toColoquinte(): No instance to place. We're gonna crash..." ) << endl;
|
||||
}
|
||||
|
@ -555,7 +554,7 @@ namespace Etesian {
|
|||
|
||||
bool tooManyInstances = false;
|
||||
index_t instanceId = 0;
|
||||
for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences(getBlockInstance()) )
|
||||
for ( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) )
|
||||
{
|
||||
if (tooManyInstances or (instanceId == instancesNb)) {
|
||||
tooManyInstances = true;
|
||||
|
@ -737,8 +736,6 @@ namespace Etesian {
|
|||
_placementLB.positions_ = positions;
|
||||
_placementLB.orientations_ = orientations;
|
||||
_placementUB = _placementLB;
|
||||
|
||||
Cell::setFlattenLeafMode( false );
|
||||
}
|
||||
|
||||
|
||||
|
@ -750,7 +747,7 @@ namespace Etesian {
|
|||
*/
|
||||
|
||||
bool isSliceHeightSet = false;
|
||||
for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences(getBlockInstance()) )
|
||||
for ( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) )
|
||||
{
|
||||
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
|
||||
Cell* masterCell = instance->getMasterCell();
|
||||
|
@ -1113,8 +1110,7 @@ namespace Etesian {
|
|||
if (getBlockInstance()) topTransformation = getBlockInstance()->getTransformation();
|
||||
topTransformation.invert();
|
||||
|
||||
Cell::setFlattenLeafMode( true );
|
||||
for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences(getBlockInstance()) )
|
||||
for ( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) )
|
||||
{
|
||||
DbU::Unit hpitch = getHorizontalPitch();
|
||||
DbU::Unit vpitch = getSliceStep();
|
||||
|
@ -1148,7 +1144,6 @@ namespace Etesian {
|
|||
instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
||||
}
|
||||
}
|
||||
Cell::setFlattenLeafMode( false );
|
||||
|
||||
UpdateSession::close();
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -92,7 +92,7 @@ Open questions</h2>
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
\vspace*{1cm}
|
||||
{\large Generated by Doxygen 1.8.14}\\
|
||||
\vspace*{0.5cm}
|
||||
{\small Mon Feb 3 2020 17:10:36}\\
|
||||
{\small Sun Mar 8 2020 18:49:09}\\
|
||||
\end{center}
|
||||
\end{titlepage}
|
||||
|
||||
|
|
|
@ -4,9 +4,33 @@
|
|||
|
||||
namespace Hurricane {
|
||||
|
||||
/*! \class Cell
|
||||
* \brief The model (\b API).
|
||||
*/
|
||||
//! \class Cell
|
||||
//! \brief The model (\b API).
|
||||
//!
|
||||
//! \section secCellHierarchy Layout vs. Netlist Cell Hierarchy
|
||||
//!
|
||||
//! The Cell / Instance hierarchy can be walkthrough in two different
|
||||
//! modes:
|
||||
//! <ul>
|
||||
//! <li> <b>The Layout Mode</b>, in this mode the walktrough will be done
|
||||
//! over all the instances levels. This mode is used for the following
|
||||
//! collections:
|
||||
//! <ul>
|
||||
//! <li> Cell::getTerminalInstanceOccurrences().
|
||||
//! </ul>
|
||||
//!
|
||||
//! <li> <b>The Netlist Mode</b>, in this mode the walktrough will stop
|
||||
//! at instances flagged as Cell::Flags::TerminalInstance.
|
||||
//! The netlist hierarchy will be a subset of the layout one.
|
||||
//! Or, conversely, some level of layout hirearchy can have no
|
||||
//! netlist equivalent. This mode is used for the following
|
||||
//! collections:
|
||||
//!
|
||||
//! <ul>
|
||||
//! <li> Cell::getTerminalNetlistInstanceOccurrences().
|
||||
//! <li> Cell::getNonTerminalNetlistInstanceOccurrences().
|
||||
//! </ul>
|
||||
//! </ul>
|
||||
|
||||
|
||||
/*! \function Cell* Cell::create ( Library* library, const Name& name );
|
||||
|
@ -141,13 +165,17 @@
|
|||
* entities are taken into account in this Collection.
|
||||
*/
|
||||
|
||||
/*! \function Occurrences Cell::getLeafInstanceOccurrences ( const Instance* topInstance=NULL ) const;
|
||||
//! \function Occurrences Cell::getTerminalInstanceOccurrences () const;
|
||||
//! Returns the trans-hierarchical Collection of all instance Occurrences that are
|
||||
//! layout terminal cells (leaves).
|
||||
|
||||
/*! \function Occurrences Cell::getTerminalNetlistInstanceOccurrences ( const Instance* topInstance=NULL ) const;
|
||||
* Returns the trans-hierarchical Collection of all instance Occurrences that are
|
||||
* leaf cells. With the \c topInstance argument we can restrict the collection
|
||||
* to leafs of that instance (of the current Cell) only.
|
||||
*/
|
||||
|
||||
/*! \function Occurrences Cell::getNonLeafInstanceOccurrences ( const Instance* topInstance=NULL ) const;
|
||||
/*! \function Occurrences Cell::getNonTerminalNetlistInstanceOccurrences ( const Instance* topInstance=NULL ) const;
|
||||
* Returns the trans-hierarchical Collection of all instance Occurrences that are
|
||||
* \b not leaf cells. With the \c topInstance argument we can restrict the collection
|
||||
* to non-leafs of that instance (of the current Cell) only.
|
||||
|
@ -170,11 +198,15 @@
|
|||
* automatically called when creating an instance).
|
||||
*/
|
||||
|
||||
/*! \function bool Cell::isTerminal () const;
|
||||
* Returns \true if the Cell is marked as terminal (meaning that it has
|
||||
* no inside or that we dont want to take it into account), else
|
||||
* \false.
|
||||
*/
|
||||
//! \function bool Cell::isTerminal () const;
|
||||
//! Returns \true if the cell contains no instances. This is a layout
|
||||
//! leaf cell.
|
||||
|
||||
//! \function bool Cell::isTerminalNetlist () const;
|
||||
//! Returns \true if the Cell is marked as terminal for the \e netlist
|
||||
//! hierarchy. A terminal \e netlist cell may, however contains
|
||||
//! further level of physical (layout) instances. This is a state
|
||||
//! that can be set or unset.
|
||||
|
||||
//! \function bool Cell::isUnique () const;
|
||||
//! Returns \true if the Cell has one or less instances, regardless of
|
||||
|
@ -206,8 +238,8 @@
|
|||
* Box as argument.
|
||||
*/
|
||||
|
||||
/*! \function void Cell::setTerminal ( bool state );
|
||||
* sets Cell terminal status to \e state.
|
||||
/*! \function void Cell::setTerminalNetlist ( bool state );
|
||||
* sets Cell \e netlist terminal status to \e state.
|
||||
*/
|
||||
|
||||
/* \function void Cell::setSymbol ( Symbol* symbol );
|
||||
|
|
|
@ -74,7 +74,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -80,7 +80,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -50,7 +50,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -57,7 +57,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -76,7 +76,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -63,7 +63,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -76,7 +76,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -57,7 +57,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -59,7 +59,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -81,7 +81,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -57,7 +57,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -57,7 +57,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -98,7 +98,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -62,7 +62,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -62,7 +62,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -59,7 +59,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -57,7 +57,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -60,7 +60,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -57,7 +57,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -56,7 +56,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -61,7 +61,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -64,7 +64,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -57,7 +57,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -68,7 +68,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -57,7 +57,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -65,7 +65,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -57,7 +57,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -52,7 +52,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -57,7 +57,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -55,7 +55,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -72,7 +72,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -50,7 +50,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -92,7 +92,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -50,7 +50,7 @@ $(function() {
|
|||
<hr>
|
||||
<table class="footer1">
|
||||
<tr>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td>
|
||||
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
|
||||
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue