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:
Jean-Paul Chaput 2020-03-10 12:10:53 +01:00
parent e2d6929fbe
commit dfe4d80b60
466 changed files with 2480 additions and 1432 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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 ();

View File

@ -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();
}

View File

@ -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 );

View File

@ -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;
}
}
}
}

View File

@ -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 );

View File

@ -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)) {

View File

@ -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))

View File

@ -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);
}

View File

@ -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;

View File

@ -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() );
}

View File

@ -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;

View File

@ -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);

View File

@ -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)

View File

@ -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;

View File

@ -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");
}

View File

@ -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()) )

View File

@ -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.

View File

@ -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.

View File

@ -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`

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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">&quot;debian9.coriolis&quot;</span> &gt; /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> &amp; <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">&#39; ...</span>
<span class="s1"> Adding new group `ego&#39;</span> <span class="o">(</span>20000<span class="o">)</span> ...
Adding new user <span class="sb">`</span>ego<span class="s1">&#39; (20000) with group `ego&#39;</span> ...
Creating home directory <span class="sb">`</span>/home/ego<span class="s1">&#39; ...</span>
<span class="s1"> Copying files from `/etc/skel&#39;</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:~&gt; schroot -c debian9.coriolis -u ego
<span class="o">(</span>debian9.coriolis<span class="o">)</span>jpc@pc:~&gt; ./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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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&gt; ../../dockerManage.sh -bS <span class="c1"># build both system &amp; coriolis images.</span>
ego@home:debian-9&gt; ../../dockerManage.sh -r <span class="c1"># compile &amp; check coriolis.</span>
ego@home:debian-9&gt; ../../dockerManage.sh -C <span class="c1"># clear the images.</span>
<div class="highlight"><pre><span></span>ego@home:debian-9&gt; ../../dockerManage.sh -scb <span class="c1"># build system, coriolis &amp; bash images.</span>
ego@home:debian-9&gt; ../../dockerManage.sh -r <span class="c1"># run the bash image.</span>
ego@home:debian-9&gt; ../../dockerManage.sh --remove <span class="c1"># clear all images.</span>
</pre></div>
</div>
<div class="section" id="packaging-coriolis">

Binary file not shown.

View File

@ -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 )

View File

@ -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>

View File

@ -30,6 +30,7 @@ STATIC_PATHS = [ 'pages/users-guide'
, 'pages/python-cpp'
, 'pages/stratus'
, 'pages/rds'
, 'scripts'
, 'images'
, 'pdfs'
]

View File

@ -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;

View File

@ -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()))

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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>

View File

@ -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>

View File

@ -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}

View File

@ -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 );

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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