22 #include "hurricane/Flags.h"
23 #include "hurricane/Observer.h"
24 #include "hurricane/Signature.h"
25 #include "hurricane/Relation.h"
26 #include "hurricane/Pathes.h"
27 #include "hurricane/Entity.h"
28 #include "hurricane/Cells.h"
29 #include "hurricane/DeepNet.h"
30 #include "hurricane/Instance.h"
31 #include "hurricane/Pin.h"
32 #include "hurricane/Pins.h"
33 #include "hurricane/Slices.h"
34 #include "hurricane/ExtensionSlice.h"
35 #include "hurricane/Rubbers.h"
36 #include "hurricane/Markers.h"
37 #include "hurricane/Marker.h"
38 #include "hurricane/Reference.h"
39 #include "hurricane/Components.h"
40 #include "hurricane/Occurrences.h"
41 #include "hurricane/Transformation.h"
42 #include "hurricane/Layer.h"
43 #include "hurricane/QuadTree.h"
45 #include "hurricane/IntrusiveSet.h"
46 #include "hurricane/MapCollection.h"
47 #include "hurricane/NetAlias.h"
56 typedef multimap<Entity*,Entity*> SlaveEntityMap;
68 static FastRTTI _fastRTTI;
70 static inline const FastRTTI& fastRTTI ();
71 virtual const FastRTTI& vfastRTTI ()
const;
77 public:
typedef map<Name,ExtensionSlice*> ExtensionSliceMap;
79 public:
class Flags :
public BaseFlags {
81 enum Flag { NoFlags = 0
82 , BuildRings = (1 << 1)
83 , BuildClockRings = (1 << 2)
84 , BuildSupplyRings = (1 << 3)
85 , NoClockFlatten = (1 << 4)
86 , WarnOnUnplacedInstances = (1 << 5)
87 , StayOnPlugs = (1 << 6)
88 , MaskRings = BuildRings|BuildClockRings|BuildSupplyRings
90 , CellAboutToChange = (1 << 10)
91 , CellChanged = (1 << 11)
92 , CellDestroyed = (1 << 12)
94 , TerminalNetlist = (1 << 20)
98 , PowerFeed = (1 << 24)
99 , FlattenedNets = (1 << 25)
100 , AbstractedSupply = (1 << 26)
103 , SlavedAb = (1 << 29)
104 , Materialized = (1 << 30)
105 , NoExtractConsistent = (1 << 31)
109 Flags ( uint64_t flags = NoFlags );
111 virtual std::string _getTypeName ()
const;
112 virtual std::string _getString ()
const;
115 class UniquifyRelation :
public Relation {
118 static UniquifyRelation* get (
const Cell* );
120 static Name staticGetName ();
121 Name getUniqueName ();
122 static std::string getTrunkName (
Name name );
123 virtual bool hasJson ()
const;
124 virtual void toJson ( JsonWriter*,
const DBo* )
const;
125 inline void _setOwner (
Cell* );
126 inline void _setDuplicates (
unsigned int );
127 virtual string _getTypeName ()
const;
128 virtual Record* _getRecord ()
const;
130 static const Name _name;
131 unsigned int _duplicates;
133 UniquifyRelation (
Cell* );
135 virtual void _preDestroy ();
140 static void initialize ();
141 JsonProperty (
unsigned long flags );
142 virtual string getTypeName ()
const;
143 virtual JsonProperty* clone (
unsigned long )
const;
149 static void initialize ();
150 JsonPropertyRef (
unsigned long flags );
151 virtual string getTypeName ()
const;
152 virtual JsonPropertyRef* clone (
unsigned long )
const;
164 virtual Cell* getElement ()
const;
166 virtual bool isValid ()
const;
167 virtual void progress ();
168 virtual string _getString ()
const;
174 inline ClonedSet (
const Cell* cell );
175 inline ClonedSet (
const ClonedSet& );
178 virtual string _getString ()
const;
183 class SlavedsRelation :
public Relation {
186 static SlavedsRelation* get (
const Cell* );
188 static Name staticGetName ();
189 virtual bool hasJson ()
const;
190 virtual void toJson ( JsonWriter*,
const DBo* )
const;
191 inline void _setOwner (
Cell* );
192 virtual string _getTypeName ()
const;
193 virtual Record* _getRecord ()
const;
195 static const Name _name;
197 SlavedsRelation (
Cell* );
199 virtual void _preDestroy ();
204 static void initialize ();
205 JsonProperty (
unsigned long flags );
206 virtual string getTypeName ()
const;
207 virtual JsonProperty* clone (
unsigned long )
const;
213 static void initialize ();
214 JsonPropertyRef (
unsigned long flags );
215 virtual string getTypeName ()
const;
216 virtual JsonPropertyRef* clone (
unsigned long )
const;
228 virtual Cell* getElement ()
const;
230 virtual bool isValid ()
const;
231 virtual void progress ();
232 virtual string _getString ()
const;
238 inline SlavedsSet (
const Cell* cell );
239 inline SlavedsSet (
const SlavedsSet& );
242 virtual string _getString ()
const;
247 class InstanceMap :
public IntrusiveMap<const SharedName*, Instance> {
250 public:
typedef IntrusiveMap<const SharedName*, Instance>
Inherit;
252 public: InstanceMap();
254 public:
virtual const SharedName* _getKey(
Instance* instance)
const;
255 public:
virtual unsigned _getHashValue(
const SharedName* name)
const;
257 public:
virtual void _setNextElement(
Instance* instance,
Instance* nextInstance)
const;
261 public:
class SlaveInstanceSet :
public IntrusiveSet<Instance> {
264 public:
typedef IntrusiveSet<Instance>
Inherit;
266 public: SlaveInstanceSet();
268 public:
virtual unsigned _getHashValue(
Instance* slaveInstance)
const;
270 public:
virtual void _setNextElement(
Instance* slaveInstance,
Instance* nextSlaveInstance)
const;
274 public:
class NetMap :
public IntrusiveMapConst<Name, Net> {
277 public:
typedef IntrusiveMapConst<Name, Net>
Inherit;
281 public:
virtual const Name& _getKey(
Net* net)
const;
282 public:
virtual unsigned _getHashValue(
const Name& name)
const;
283 public:
virtual Net* _getNextElement(
Net* net)
const;
284 public:
virtual void _setNextElement(
Net* net,
Net* nextNet)
const;
288 class PinMap :
public IntrusiveMap<Name, Pin> {
291 public:
typedef IntrusiveMap<Name, Pin>
Inherit;
295 public:
virtual Name _getKey(
Pin* pin)
const;
296 public:
virtual unsigned _getHashValue(
Name name)
const;
297 public:
virtual Pin* _getNextElement(
Pin* pin)
const;
298 public:
virtual void _setNextElement(
Pin* pin,
Pin* nextPin)
const;
302 public:
class SliceMap :
public IntrusiveMap<const Layer*, Slice> {
305 public:
typedef IntrusiveMap<const Layer*, Slice>
Inherit;
309 public:
virtual const Layer* _getKey(
Slice* slice)
const;
310 public:
virtual unsigned _getHashValue(
const Layer* layer)
const;
311 public:
virtual Slice* _getNextElement(
Slice* slice)
const;
312 public:
virtual void _setNextElement(
Slice* slice,
Slice* nextSlice)
const;
316 public:
class MarkerSet :
public IntrusiveSet<Marker> {
319 public:
typedef IntrusiveSet<Marker>
Inherit;
323 public:
virtual unsigned _getHashValue(Marker* marker)
const;
324 public:
virtual Marker* _getNextElement(Marker* marker)
const;
325 public:
virtual void _setNextElement(Marker* marker, Marker* nextMarker)
const;
334 private:
Path _shuntedPath;
335 private: InstanceMap _instanceMap;
337 private: SlaveInstanceSet _slaveInstanceSet;
338 private: NetMap _netMap;
339 private: PinMap _pinMap;
340 private: SliceMap* _sliceMap;
341 private: ExtensionSliceMap _extensionSlices;
342 private: MarkerSet _markerSet;
343 private:
Box _abutmentBox;
344 private:
Box _boundingBox;
345 private:
Cell* _nextOfLibraryCellMap;
346 private:
Cell* _nextOfSymbolCellSet;
347 private: SlaveEntityMap _slaveEntityMap;
348 private: AliasNameSet _netAliasSet;
349 private: Observable _observers;
350 private: Flags _flags;
360 protected:
virtual void _postCreate();
362 protected:
virtual void _preDestroy();
364 public:
virtual string _getTypeName()
const {
return _TName(
"Cell");};
365 public:
virtual string _getString()
const;
366 public:
virtual Record* _getRecord()
const;
367 public:
static string getFlagString( uint64_t );
368 public:
static Record* getFlagRecord( uint64_t );
369 public:
static Slot* getFlagSlot( uint64_t );
371 public: InstanceMap& _getInstanceMap() {
return _instanceMap;};
372 public:
QuadTree* _getQuadTree() {
return _quadTree;};
373 public: SlaveInstanceSet& _getSlaveInstanceSet() {
return _slaveInstanceSet;};
374 public: NetMap& _getNetMap() {
return _netMap;};
375 public: PinMap& _getPinMap() {
return _pinMap;};
376 public: SliceMap* _getSliceMap() {
return _sliceMap;};
377 public: ExtensionSliceMap& _getExtensionSliceMap() {
return _extensionSlices;};
378 public: MarkerSet& _getMarkerSet() {
return _markerSet;};
379 public:
Cell* _getNextOfLibraryCellMap()
const {
return _nextOfLibraryCellMap;};
380 public:
Cell* _getNextOfSymbolCellSet()
const {
return _nextOfSymbolCellSet;};
381 public: AliasNameSet& _getNetAliasSet() {
return _netAliasSet; }
383 public:
void _setNextOfLibraryCellMap(
Cell* cell) {_nextOfLibraryCellMap = cell;};
384 public:
void _setNextOfSymbolCellSet(
Cell* cell) {_nextOfSymbolCellSet = cell;};
386 public:
void _addNetAlias(NetAliasName* alias) { _netAliasSet.insert(alias); }
387 public:
void _removeNetAlias(NetAliasName* alias) { _netAliasSet.erase(alias); }
389 public:
void _fit(
const Box& box);
390 public:
void _unfit(
const Box& box);
392 public:
void _addSlaveEntity(
Entity* entity,
Entity* slaveEntity);
393 public:
void _removeSlaveEntity(
Entity* entity,
Entity* slaveEntity);
394 public:
void _getSlaveEntities(SlaveEntityMap::iterator& begin, SlaveEntityMap::iterator& end);
395 public:
void _getSlaveEntities(
Entity* entity, SlaveEntityMap::iterator& begin, SlaveEntityMap::iterator& end);
396 public:
void _insertSlice(ExtensionSlice*);
397 public:
void _removeSlice(ExtensionSlice*);
398 public:
void _slaveAbutmentBox(
Cell*);
399 public:
void _setShuntedPath(
Path path) { _shuntedPath=path; }
400 protected:
void _setAbutmentBox(
const Box& abutmentBox);
402 public:
virtual void _toJson(JsonWriter*)
const;
403 public:
virtual void _toJsonCollections(JsonWriter*)
const;
409 public:
static Cell* fromJson(
const string& filename);
414 public:
virtual Cell* getCell()
const {
return (
Cell*)
this;};
415 public:
virtual Box getBoundingBox()
const;
417 public:
string getHierarchicalName()
const;
419 public:
const Flags& getFlags()
const {
return _flags; }
420 public: Flags& getFlags() {
return _flags; }
421 public: Path getShuntedPath()
const {
return _shuntedPath; }
422 public: Entity* getEntity(
const Signature&)
const;
425 public:
Instances getPlacedInstances()
const;
426 public:
Instances getFixedInstances()
const;
427 public:
Instances getUnplacedInstances()
const;
428 public:
Instances getNotUnplacedInstances()
const;
430 public:
Instances getPlacedInstancesUnder(
const Box& area)
const;
431 public:
Instances getFixedInstancesUnder(
const Box& area)
const;
432 public:
Instances getUnplacedInstancesUnder(
const Box& area)
const;
433 public:
Instances getNotUnplacedInstancesUnder(
const Box& area)
const;
435 public:
Instances getTerminalInstances()
const;
436 public:
Instances getTerminalInstancesUnder(
const Box& area)
const;
437 public:
Instances getNonTerminalInstances()
const;
438 public:
Instances getNonTerminalInstancesUnder(
const Box& area)
const;
439 public:
Instances getTerminalNetlistInstances()
const;
440 public:
Instances getTerminalNetlistInstancesUnder(
const Box& area)
const;
441 public:
Instances getNonTerminalNetlistInstances()
const;
442 public:
Instances getNonTerminalNetlistInstancesUnder(
const Box& area)
const;
444 public: DeepNet* getDeepNet(
Path,
const Net* )
const;
451 public:
Nets getPowerNets()
const;
452 public:
Nets getGroundNets()
const;
453 public:
Pin* getPin(
const Name& name)
const {
return _pinMap.getElement(name);};
454 public:
Pins getPins()
const {
return _pinMap.getElements();};
457 public:
const ExtensionSliceMap& getExtensionSliceMap()
const {
return _extensionSlices; };
458 public: ExtensionSlice* getExtensionSlice(
const Name& name)
const;
459 public: ExtensionSlices getExtensionSlices(ExtensionSlice::Mask mask=~0)
const;
462 public: Markers getMarkers()
const {
return _markerSet.getElements();};
463 public: Markers getMarkersUnder(
const Box& area)
const;
464 public: References getReferences()
const;
469 public:
Occurrences getTerminalInstanceOccurrencesUnder(
const Box& area)
const;
471 public:
Occurrences getTerminalNetlistInstanceOccurrencesUnder(
const Box& area)
const;
475 public:
Occurrences getHyperNetRootNetOccurrences()
const;
476 public: ExtensionSlice::Mask getExtensionSliceMask (
const Name& name )
const;
477 public:
Gos getExtensionGos (
const Name& name )
const;
478 public:
Gos getExtensionGos ( ExtensionSlice::Mask mask = ~0 )
const;
479 public:
Gos getExtensionGosUnder (
const Box& area,
const Name& name )
const;
480 public:
Gos getExtensionGosUnder (
const Box& area, ExtensionSlice::Mask mask = ~0 )
const;
481 public:
Cells getSubCells()
const;
482 public:
Cells getClonedCells()
const;
483 public:
Cell* getCloneMaster()
const;
484 public:
Pathes getRecursiveSlavePathes()
const;
491 public:
bool isTerminal()
const {
return _instanceMap.isEmpty();};
496 public:
bool isPad()
const {
return _flags.isset(Flags::Pad);};
497 public:
bool isFeed()
const {
return _flags.isset(Flags::Feed);};
498 public:
bool isDiode()
const {
return _flags.isset(Flags::Diode);};
499 public:
bool isPowerFeed()
const {
return _flags.isset(Flags::PowerFeed);};
500 public:
bool isFlattenedNets()
const {
return _flags.isset(Flags::FlattenedNets);};
501 public:
bool isAbstractedSupply()
const {
return _flags.isset(Flags::AbstractedSupply);};
502 public:
bool isPlaced()
const {
return _flags.isset(Flags::Placed);};
503 public:
bool isRouted()
const {
return _flags.isset(Flags::Routed);};
504 public:
bool isExtractConsistent()
const {
return not _flags.isset(Flags::NoExtractConsistent);};
505 public:
bool isNetAlias(
const Name& name)
const;
512 public:
void slaveAbutmentBox(
Cell*);
513 public:
void unslaveAbutmentBox(
Cell*);
515 public:
void setPad(
bool state) {_flags.set(Flags::Pad,state);};
516 public:
void setFeed(
bool state) {_flags.set(Flags::Feed,state);};
517 public:
void setDiode(
bool state) {_flags.set(Flags::Diode,state);};
518 public:
void setPowerFeed(
bool state) {_flags.set(Flags::PowerFeed,state);};
519 public:
void setRouted(
bool state) {_flags.set(Flags::Routed,state);};
520 public:
void setAbstractedSupply(
bool state) { _flags.set(Flags::AbstractedSupply,state); };
521 public:
void setNoExtractConsistent(
bool state) { _flags.set(Flags::NoExtractConsistent,state); };
522 public:
void flattenNets(uint64_t flags=Flags::BuildRings);
523 public:
void flattenNets(
const Instance* instance, uint64_t flags=Flags::BuildRings);
524 public:
void flattenNets(
const Instance* instance,
const std::set<std::string>& excludeds, uint64_t flags=Flags::BuildRings);
525 public:
void createRoutingPadRings(uint64_t flags=Flags::BuildRings);
526 public:
void setFlags(uint64_t flags) { _flags |= flags; }
527 public:
void resetFlags(uint64_t flags) { _flags &= ~flags; }
528 public:
bool updatePlacedFlag();
533 public:
void uniquify(
unsigned int depth=std::numeric_limits<unsigned int>::max());
534 public:
void addObserver(BaseObserver*);
535 public:
void removeObserver(BaseObserver*);
536 public:
void notify(
unsigned flags);
537 public:
void destroyPhysical();
541 inline const FastRTTI& Cell::fastRTTI () {
return _fastRTTI; }
544 inline Cell::ClonedSet::Locator::Locator (
const Locator& other )
546 , _dboLocator(other._dboLocator)
549 inline Cell::ClonedSet::ClonedSet (
const Cell* cell )
554 inline Cell::ClonedSet::ClonedSet (
const ClonedSet& other )
560 inline void Cell::UniquifyRelation::_setOwner ( Cell* owner ) { _setMasterOwner(owner); }
561 inline void Cell::UniquifyRelation::_setDuplicates (
unsigned int duplicates ) { _duplicates=duplicates; }
564 inline Cell::SlavedsSet::Locator::Locator (
const Locator& other )
566 , _dboLocator(other._dboLocator)
569 inline Cell::SlavedsSet::SlavedsSet (
const Cell* cell )
574 inline Cell::SlavedsSet::SlavedsSet (
const SlavedsSet& other )
580 inline void Cell::SlavedsRelation::_setOwner ( Cell* owner ) { _setMasterOwner(owner); }
583 class JsonCell :
public JsonEntity {
586 public:
static void initialize();
587 public: JsonCell(
unsigned long flags);
588 public:
virtual ~JsonCell();
589 public:
virtual string getTypeName()
const;
590 public:
virtual JsonCell* clone(
unsigned long)
const;
591 public:
virtual void toData(JsonStack&);
592 private: Cell* _cell;
593 private:
bool _materializationState;
600 INSPECTOR_P_SUPPORT(Hurricane::Cell::Flags);
601 INSPECTOR_P_SUPPORT(Hurricane::Cell::InstanceMap);
602 INSPECTOR_P_SUPPORT(Hurricane::Cell::SlaveInstanceSet);
603 INSPECTOR_P_SUPPORT(Hurricane::Cell::NetMap);
604 INSPECTOR_P_SUPPORT(Hurricane::Cell::PinMap);
605 INSPECTOR_P_SUPPORT(Hurricane::Cell::SliceMap);
606 INSPECTOR_P_SUPPORT(Hurricane::Cell::MarkerSet);
607 INSPECTOR_PR_SUPPORT(Hurricane::Cell::SlavedsRelation);
Box description (API)
Definition: Box.h:30
The model (API).
Definition: Cell.h:64
const Name & getName() const
Definition: Cell.h:418
bool isUniquifyMaster() const
Nets getInternalNets() const
const Box & getAbutmentBox() const
Definition: Cell.h:485
Nets getGlobalNets() const
bool isCalledBy(Cell *cell) const
Nets getClockNets() const
Occurrences getTerminalInstanceOccurrences() const
Instances getInstancesUnder(const Box &area, DbU::Unit threshold=0) const
Components getComponentsUnder(const Box &area, const Layer::Mask &mask=Layer::Mask::FFFF) const
void setTerminalNetlist(bool state)
Definition: Cell.h:514
Slices getSlices(const Layer::Mask &mask=Layer::Mask::FFFF) const
Rubbers getRubbers() const
Rubbers getRubbersUnder(const Box &area) const
Occurrences getTerminalNetlistInstanceOccurrences(const Instance *topInstance=NULL) const
bool isTerminalNetlist() const
Definition: Cell.h:492
Net * getNet(const Name &name, bool useAlias=true) const
Instances getSlaveInstances() const
Components getComponents(const Layer::Mask &mask=Layer::Mask::FFFF) const
bool isUniquified() const
Nets getNets() const
Definition: Cell.h:445
Occurrences getNonTerminalNetlistInstanceOccurrences(const Instance *topInstance=NULL) const
void uniquify(unsigned int depth=std::numeric_limits< unsigned int >::max())
Nets getExternalNets() const
Library * getLibrary() const
Definition: Cell.h:416
Instances getInstances() const
Definition: Cell.h:424
bool isTerminal() const
Definition: Cell.h:491
void setAbutmentBox(const Box &abutmentBox)
Occurrences getOccurrences(unsigned searchDepth=std::numeric_limits< unsigned int >::max()) const
Instance * getInstance(const Name &name) const
Definition: Cell.h:423
Slice * getSlice(const Layer *layer) const
Definition: Cell.h:455
Nets getSupplyNets() const
void setName(const Name &name)
static Cell * create(Library *library, const Name &name)
Occurrences getOccurrencesUnder(const Box &area, unsigned searchDepth=std::numeric_limits< unsigned int >::max(), DbU::Unit threshold=0) const
Collection description (API)
Definition: Collection.h:39
DataBase object root class (API).
Definition: DBo.h:45
std::int64_t Unit
Definition: DbU.h:67
Occurrenceable objects root class (API).
Definition: Entity.h:37
Generic Collection auto-pointer.
Definition: Collection.h:235
Instance description (API)
Definition: Instance.h:35
Support for JSON export.
Definition: JsonObject.h:83
JSON Parser Stack.
Definition: JsonObject.h:249
Layer description (API)
Definition: Layer.h:120
Hurricane::Mask< boost::multiprecision::uint128_t > Mask
Definition: Layer.h:123
Library description (API)
Definition: Library.h:38
Locator description (API)
Definition: Locator.h:33
Name description (API)
Definition: Name.h:35
Net description (API)
Definition: Net.h:46
Pad description (API)
Definition: Pad.h:36
Path description (API)
Definition: Path.h:35
Pin description (API)
Definition: Pin.h:41
QuadTree description (API)
Definition: QuadTree.h:33
Relation description (API)
Definition: Relation.h:33
Slice description (API)
Definition: Slice.h:38
Contains Almost Everything.
Definition: BasicLayer.h:39