34#include "hurricane/Mask.h"
35#include "hurricane/DBo.h"
36#include "hurricane/Layers.h"
37#include "hurricane/DbU.h"
38#include "hurricane/Box.h"
39#include "hurricane/BasicLayers.h"
52 class ParallelSpacings {
54 inline ParallelSpacings ();
55 inline size_t size ()
const;
56 inline DbU::Unit spacing (
size_t i )
const;
57 inline DbU::Unit parallelLength (
size_t i )
const;
59 inline DbU::Unit maxParallelLength ()
const;
62 std::vector< std::pair<DbU::Unit,DbU::Unit> > _spacings;
66 inline ParallelSpacings::ParallelSpacings ()
70 inline size_t ParallelSpacings::size ()
const {
return _spacings.size(); }
71 inline DbU::Unit ParallelSpacings::spacing (
size_t i )
const {
return (i < size()) ? _spacings[i].first : 0; }
72 inline DbU::Unit ParallelSpacings::parallelLength (
size_t i )
const {
return (i < size()) ? _spacings[i].second : 0; }
73 inline DbU::Unit ParallelSpacings::maxSpacing ()
const {
return _spacings.back().first ; }
74 inline DbU::Unit ParallelSpacings::maxParallelLength ()
const {
return _spacings.back().second; }
75 inline void ParallelSpacings::push_back ( DbU::Unit spacing, DbU::Unit parallelLength )
76 { _spacings.push_back( make_pair( spacing, parallelLength )); }
84 friend class ParallelSpacings;
86 inline SpacingRules (
const Layer* );
87 inline size_t parallelsSize ()
const;
88 inline size_t widthsSize ()
const;
89 inline const std::vector<DbU::Unit>& parallelLengths ()
const;
90 const std::vector<DbU::Unit>& widthsRow ( DbU::Unit width )
const;
91 inline DbU::Unit minimalSpacing ()
const;
92 void print ( std::ostream& )
const;
93 void addSpacingRule ( DbU::Unit minimalSpacing, DbU::Unit width, DbU::Unit parallelLength );
94 void _onDbuChange (
float scale );
95 ParallelSpacings parallelSpacings (
const Box&,
bool isHorizontal )
const;
97 SpacingRules (
const SpacingRules& ) =
delete;
100 std::map< DbU::Unit, std::vector<DbU::Unit> > _table;
104 inline SpacingRules::SpacingRules (
const Layer* layer )
108 _table.emplace( -1, std::vector<DbU::Unit>() );
111 inline const std::vector<DbU::Unit>& SpacingRules::parallelLengths ()
const {
return _table.begin()->second; }
112 inline size_t SpacingRules::parallelsSize ()
const {
return parallelLengths().size(); }
113 inline size_t SpacingRules::widthsSize ()
const {
return _table.size() - 1; }
114 inline DbU::Unit SpacingRules::minimalSpacing ()
const {
return (_table.size() < 2) ? 0 : (++_table.begin())->second[0]; }
120 class Layer :
public DBo {
123 typedef Hurricane::Mask<boost::multiprecision::uint128_t>
Mask;
125 static const uint32_t NoFlags = 0;
126 static const uint32_t EnclosureH = (1 << 0);
127 static const uint32_t EnclosureV = (1 << 1);
128 static const uint32_t EnclosureMax = (1 << 2);
129 static const uint32_t ExtensionCap = (1 << 3);
130 static const uint32_t ExtensionWidth = (1 << 4);
134 inline void printSpacingTable ()
const;
141 inline ParallelSpacings getParallelSpacings (
const Box&,
bool isHorizontal )
const;
143 virtual const Layer* getBlockageLayer ()
const;
144 virtual const Layer* getRoutingLayer ()
const;
145 virtual const Layer* getCut ()
const;
153 virtual DbU::Unit getEnclosure ( uint32_t flags )
const;
154 virtual DbU::Unit getExtentionCap ()
const;
155 virtual DbU::Unit getExtentionWidth ()
const;
159 virtual DbU::Unit getTopEnclosure ( uint32_t flags )
const;
160 virtual DbU::Unit getBottomEnclosure ( uint32_t flags )
const;
161 virtual double getMinimalArea ()
const;
163 inline bool above (
const Layer* layer )
const;
164 inline bool below (
const Layer* layer )
const;
167 inline bool isSymbolic ()
const;
168 inline bool isBlockage ()
const;
171 inline void setSymbolic (
bool );
172 inline void setBlockage (
bool );
178 virtual void setMinimalArea (
double );
180 virtual void _toJson ( JsonWriter* )
const;
181 virtual string _getString ()
const;
182 virtual Record* _getRecord ()
const;
183 inline Layer* _getNextOfTechnologyLayerMap ()
const;
184 inline void _setMask (
const Mask& mask );
185 inline void _setExtractMask (
const Mask& extractMask );
186 inline void _setNextOfTechnologyLayerMap ( Layer* layer );
187 virtual void _onDbuChange (
float scale );
188 static const Name& _sgetName (
const Layer* );
197 SpacingRules _spacingRules;
198 Layer* _nextOfTechnologyLayerMap;
211 virtual void _postCreate ();
212 virtual void _preDestroy ();
215 struct CompareByMask {
216 inline bool operator() (
const Layer* lhs,
const Layer* rhs )
const;
222 inline void Layer::printSpacingTable ()
const {
return _spacingRules.print( std::cout ); }
223 inline ParallelSpacings Layer::getParallelSpacings (
const Box& bb,
bool isHorizontal )
const {
return _spacingRules.parallelSpacings(bb,isHorizontal); }
224 inline bool Layer::isSymbolic ()
const {
return _symbolic; }
225 inline bool Layer::isBlockage ()
const {
return _blockage; }
233 inline void Layer::setSymbolic (
bool state ) { _symbolic = state; }
234 inline void Layer::setBlockage (
bool state ) { _blockage = state; }
235 inline Layer* Layer::_getNextOfTechnologyLayerMap ()
const {
return _nextOfTechnologyLayerMap; }
236 inline void Layer::_setMask (
const Mask& mask ) { _mask = mask; }
237 inline void Layer::_setExtractMask (
const Mask& extractMask ) { _extractMask = extractMask; }
238 inline void Layer::_setNextOfTechnologyLayerMap ( Layer* layer ) { _nextOfTechnologyLayerMap = layer; }
240 inline bool Layer::CompareByMask::operator() (
const Layer* lhs,
const Layer* rhs )
const
241 {
return (lhs?lhs->getMask():Layer::Mask()) < (rhs?rhs->getMask():Layer::Mask()); }
247 class JsonLayer :
public JsonDBo {
249 JsonLayer (
unsigned long flags );
250 Technology* lookupTechnology ( JsonStack&,
const string& fname )
const;
BasicLayer description (API)
Definition BasicLayer.h:42
Box description (API)
Definition Box.h:30
std::int64_t Unit
Definition DbU.h:67
Layer description (API)
Definition Layer.h:120
virtual void setEnclosure(const BasicLayer *layer, DbU::Unit, uint32_t flags)
bool below(const Layer *layer) const
Definition Layer.h:227
void setMinimalSpacing(DbU::Unit minimalSpacing, DbU::Unit width, DbU::Unit parallelLength)
const Mask & getMask() const
Definition Layer.h:230
virtual const Layer * getOpposite(const Layer *) const
virtual void setExtentionWidth(const BasicLayer *layer, DbU::Unit)
const Name & getName() const
Definition Layer.h:229
Layer * getMetalBelow(bool useSymbolic=true) const
virtual const Layer * getTop() const
virtual BasicLayers getBasicLayers() const =0
virtual void setExtentionCap(const BasicLayer *layer, DbU::Unit)
Hurricane::Mask< boost::multiprecision::uint128_t > Mask
Definition Layer.h:123
Layer * getCutBelow(bool useSymbolic=true) const
virtual const Layer * getBottom() const
DbU::Unit getMinimalSize() const
Definition Layer.h:232
void setName(const Name &name)
bool above(const Layer *layer) const
Definition Layer.h:226
void setMinimalSize(DbU::Unit minimalSize)
Layer * getMetalAbove(bool useSymbolic=true) const
Layer * getCutAbove(bool useSymbolic=true) const
bool intersect(const Layer *layer) const
Technology * getTechnology() const
Definition Layer.h:228
DbU::Unit getMinimalSpacing() const
const Mask & getExtractMask() const
Definition Layer.h:231
bool contains(const Layer *layer) const
Name description (API)
Definition Name.h:35
Technological rules description (API).
Definition Technology.h:62
Contains Almost Everything.
Definition BasicLayer.h:39