Merge branch 'devel' into 'serge/changes'
# Conflicts: # Seabreeze/CMakeLists.txt # anabatic/CMakeLists.txt # anabatic/src/CMakeLists.txt # bootstrap/CMakeLists.txt # bora/CMakeLists.txt # crlcore/CMakeLists.txt # crlcore/src/cyclop/CMakeLists.txt # crlcore/src/pyCRL/CMakeLists.txt # crlcore/src/x2y/CMakeLists.txt # etesian/CMakeLists.txt # etesian/src/CMakeLists.txt # flute/CMakeLists.txt # flute/src/3.1/CMakeLists.txt # foehn/CMakeLists.txt # hurricane/CMakeLists.txt # hurricane/src/isobar/CMakeLists.txt # ispd/CMakeLists.txt # karakaze/CMakeLists.txt # katana/CMakeLists.txt # katana/src/CMakeLists.txt # oroshi/CMakeLists.txt # stratus1/CMakeLists.txt # tutorial/CMakeLists.txt # unicorn/CMakeLists.txt # unittests/CMakeLists.txt
This commit is contained in:
commit
1ea1a402e6
|
@ -18,9 +18,9 @@
|
|||
set_cmake_policies()
|
||||
setup_boost(program_options)
|
||||
setup_qt()
|
||||
setup_python()
|
||||
|
||||
find_package(Libexecinfo REQUIRED)
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(LEFDEF REQUIRED)
|
||||
find_package(FLUTE REQUIRED)
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
set_cmake_policies()
|
||||
setup_boost()
|
||||
setup_qt()
|
||||
setup_python()
|
||||
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(FLUTE REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
|
|
|
@ -3069,6 +3069,7 @@ namespace Anabatic {
|
|||
if (wPitch > 1) segment->setFlags( SegWide );
|
||||
if (source->canDrag() or target->canDrag()) segment->setFlags( SegDrag );
|
||||
if (dir & Flags::UseNonPref) segment->setFlags( SegNonPref );
|
||||
if (dir.contains(Flags::UseNonPref|Flags::OnVSmall)) segment->setFlags( SegOnVSmall );
|
||||
|
||||
return segment;
|
||||
}
|
||||
|
|
|
@ -14,7 +14,6 @@ endif ( CHECK_DETERMINISM )
|
|||
${QtX_INCLUDE_DIRS}
|
||||
${Python_INCLUDE_DIRS}
|
||||
)
|
||||
find_package (Python 3 COMPONENTS Interpreter Development.Module )
|
||||
set( includes anabatic/Constants.h
|
||||
anabatic/Configuration.h
|
||||
anabatic/Matrix.h
|
||||
|
|
|
@ -132,6 +132,7 @@ namespace Anabatic {
|
|||
const BaseFlags Flags::NoMinLength = (1L << 37);
|
||||
const BaseFlags Flags::NoSegExt = (1L << 38);
|
||||
const BaseFlags Flags::NullLength = (1L << 39);
|
||||
const BaseFlags Flags::OnVSmall = (1L << 40);
|
||||
|
||||
|
||||
Flags::~Flags ()
|
||||
|
|
|
@ -277,7 +277,9 @@ namespace Anabatic {
|
|||
|
||||
if (flags & (VSmall|UseNonPref)) {
|
||||
cdebug_log(145,0) << "case: UseNonPref" << endl;
|
||||
|
||||
|
||||
if (flags & VSmall)
|
||||
useNonPref.reset( Flags::UseNonPref );
|
||||
AutoContact* subContact1 = AutoContactTurn::create( gcell, rp->getNet(), Session::getBuildContactLayer(rpDepth+1) );
|
||||
AutoSegment::create( rpSourceContact, subContact1, Flags::Vertical|useNonPref );
|
||||
rpSourceContact = subContact1;
|
||||
|
|
|
@ -109,6 +109,7 @@ namespace Anabatic {
|
|||
static const uint64_t SegNonPref = (1L<<37);
|
||||
static const uint64_t SegAtMinArea = (1L<<38);
|
||||
static const uint64_t SegNoMoveUp = (1L<<39);
|
||||
static const uint64_t SegOnVSmall = (1L<<40);
|
||||
// Masks.
|
||||
static const uint64_t SegWeakTerminal = SegStrongTerminal|SegWeakTerminal1|SegWeakTerminal2;
|
||||
static const uint64_t SegNotAligned = SegNotSourceAligned|SegNotTargetAligned;
|
||||
|
@ -202,6 +203,7 @@ namespace Anabatic {
|
|||
inline bool isTerminal () const;
|
||||
inline bool isUnbreakable () const;
|
||||
inline bool isNonPref () const;
|
||||
inline bool isNonPrefOnVSmall () const;
|
||||
inline bool isDrag () const;
|
||||
inline bool isAtMinArea () const;
|
||||
inline bool isNotSourceAligned () const;
|
||||
|
@ -536,6 +538,7 @@ namespace Anabatic {
|
|||
inline bool AutoSegment::isLocal () const { return not (_flags & SegGlobal); }
|
||||
inline bool AutoSegment::isUnbreakable () const { return _flags & SegUnbreakable; }
|
||||
inline bool AutoSegment::isNonPref () const { return _flags & SegNonPref; }
|
||||
inline bool AutoSegment::isNonPrefOnVSmall () const { return (_flags & SegNonPref) and (_flags & SegOnVSmall); }
|
||||
inline bool AutoSegment::isBipoint () const { return _flags & SegBipoint; }
|
||||
inline bool AutoSegment::isWeakTerminal () const { return (_rpDistance < 2); }
|
||||
inline bool AutoSegment::isWeakTerminal1 () const { return (_rpDistance == 1); }
|
||||
|
|
|
@ -110,6 +110,7 @@ namespace Anabatic {
|
|||
static const BaseFlags NoMinLength ;
|
||||
static const BaseFlags NoSegExt ;
|
||||
static const BaseFlags NullLength ;
|
||||
static const BaseFlags OnVSmall ;
|
||||
public:
|
||||
inline Flags ( uint64_t flags = NoFlags );
|
||||
inline Flags ( const Hurricane::BaseFlags& );
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
|
||||
list(INSERT CMAKE_MODULE_PATH 0 "${Bootstrap_SOURCE_DIR}/cmake_modules/")
|
||||
find_package(Bootstrap REQUIRED)
|
||||
# find_package(Python 3 REQUIRED COMPONENTS Interpreter Development )
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
print_cmake_module_path()
|
||||
|
|
|
@ -35,6 +35,7 @@ class Builder:
|
|||
self._noCache = False
|
||||
self._ninja = False
|
||||
self._clang = False
|
||||
self._manylinux = False
|
||||
self._noSystemBoost = False
|
||||
self._macports = False
|
||||
self._devtoolset = 0
|
||||
|
@ -62,6 +63,7 @@ class Builder:
|
|||
elif attribute == "noCache": self._noCache = value
|
||||
elif attribute == "ninja": self._ninja = value
|
||||
elif attribute == "clang": self._clang = value
|
||||
elif attribute == "manylinux": self._manylinux = value
|
||||
elif attribute == "macports":
|
||||
self._macports = value
|
||||
if value: self._noSystemBoost = True
|
||||
|
@ -177,6 +179,7 @@ class Builder:
|
|||
if self._bfd: command += [ "-D", "USE_LIBBFD:STRING=%s" % self._bfd ]
|
||||
if self._qt4: command += [ "-D", "WITH_QT4:STRING=TRUE" ]
|
||||
if self._openmp: command += [ "-D", "WITH_OPENMP:STRING=TRUE" ]
|
||||
if self._manylinux: command += [ "-D", "USE_MANYLINUX:STRING=TRUE" ]
|
||||
command += [ "-D", "CMAKE_BUILD_TYPE:STRING=%s" % self.buildMode
|
||||
#, "-D", "BUILD_SHARED_LIBS:STRING=%s" % self.enableShared
|
||||
, "-D", "CMAKE_INSTALL_PREFIX:STRING=%s" % self.installDir
|
||||
|
|
|
@ -211,6 +211,7 @@ parser.add_option ( "--bfd" , action="store_true" ,
|
|||
parser.add_option ( "--openmp" , action="store_true" , dest="openmp" , help="Enable the use of OpenMP in Gcc." )
|
||||
parser.add_option ( "--ninja" , action="store_true" , dest="ninja" , help="Use Ninja instead of UNIX Makefile." )
|
||||
parser.add_option ( "--clang" , action="store_true" , dest="clang" , help="Force use of Clang C/C++ compiler instead of system default." )
|
||||
parser.add_option ( "--manylinux" , action="store_true" , dest="manylinux" , help="Build target is manylinux (PyPY)." )
|
||||
parser.add_option ( "--make" , action="store" , type="string", dest="makeArguments" , help="Arguments to pass to make (ex: \"-j4 install\")." )
|
||||
parser.add_option ( "--project" , action="append" , type="string", dest="projects" , help="The name of a project to build (may appears any number of time)." )
|
||||
parser.add_option ( "-t", "--tool" , action="append" , type="string", dest="tools" , help="The name of a tool to build (may appears any number of time)." )
|
||||
|
@ -282,6 +283,7 @@ else:
|
|||
if options.llvmtoolset: builder.llvmtoolset = options.llvmtoolset
|
||||
if options.bfd: builder.bfd = "ON"
|
||||
if options.qt4: builder.qt4 = True
|
||||
if options.manylinux: builder.manylinux = True
|
||||
if options.openmp: builder.openmp = True
|
||||
if options.makeArguments: builder.makeArguments = options.makeArguments
|
||||
#if options.svnMethod: builder.svnMethod = options.svnMethod
|
||||
|
|
|
@ -223,6 +223,20 @@ endif()
|
|||
endmacro(setup_boost)
|
||||
|
||||
|
||||
#
|
||||
# Setup Python, select detection depending on USE_MANYLINUX.
|
||||
#
|
||||
macro(setup_python)
|
||||
set(pydevelArg "Development")
|
||||
|
||||
if (USE_MANYLINUX)
|
||||
message(STATUS "Build for manylinux")
|
||||
set(pydevelArg "Development.Module")
|
||||
endif()
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter ${pydevelArg} )
|
||||
endmacro()
|
||||
|
||||
|
||||
#
|
||||
# Find Qt, the union of all the modules we need for the whole project.
|
||||
#
|
||||
|
|
|
@ -18,9 +18,9 @@
|
|||
setup_boost(program_options)
|
||||
setup_qt()
|
||||
setup_qwt()
|
||||
setup_python()
|
||||
|
||||
find_package(Libexecinfo REQUIRED)
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(LEFDEF REQUIRED)
|
||||
find_package(FLUTE REQUIRED)
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
setup_sysconfdir("${CMAKE_INSTALL_PREFIX}")
|
||||
setup_boost(program_options)
|
||||
setup_qt()
|
||||
setup_python()
|
||||
|
||||
cmake_policy(SET CMP0054 NEW)
|
||||
|
||||
|
@ -28,7 +29,6 @@
|
|||
find_package(Libbfd)
|
||||
endif()
|
||||
find_package(BZip2 REQUIRED)
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(BISON REQUIRED)
|
||||
find_package(FLEX REQUIRED)
|
||||
|
|
|
@ -11,6 +11,7 @@ from coriolis.CRL import AllianceFramework, Gds, LefImport, CellGa
|
|||
RoutingGauge, RoutingLayerGauge
|
||||
from coriolis.helpers import l, u, n, overlay, io, ndaTopDir
|
||||
from coriolis.helpers.overlay import CfgCache, UpdateSession
|
||||
from coriolis.Anabatic import StyleFlags
|
||||
|
||||
|
||||
__all__ = [ "setup" ]
|
||||
|
@ -27,7 +28,7 @@ def _routing ():
|
|||
rg.setSymbolic( False )
|
||||
rg.addLayerGauge(
|
||||
RoutingLayerGauge.create( tech.getLayer( 'Metal1' ) # metal
|
||||
, RoutingLayerGauge.Vertical # preferred routing direction
|
||||
, RoutingLayerGauge.Horizontal # preferred routing direction
|
||||
, RoutingLayerGauge.PinOnly # layer usage
|
||||
, 0 # depth
|
||||
, 0.0 # density (deprecated)
|
||||
|
@ -39,7 +40,7 @@ def _routing ():
|
|||
, u(0.0 ) )) # obstacle dW
|
||||
rg.addLayerGauge(
|
||||
RoutingLayerGauge.create( tech.getLayer( 'Metal2' ) # metal
|
||||
, RoutingLayerGauge.Horizontal # preferred routing direction
|
||||
, RoutingLayerGauge.Vertical # preferred routing direction
|
||||
, RoutingLayerGauge.Default # layer usage
|
||||
, 1 # depth
|
||||
, 0.0 # density (deprecated)
|
||||
|
@ -48,10 +49,10 @@ def _routing ():
|
|||
, u(0.28) # wire width
|
||||
, u(0.28) # perpandicular wire width
|
||||
, u(0.26) # VIA side
|
||||
, u(0.0 ) )) # obstacle dW
|
||||
, u(0.0 ) )) # obstacle dW
|
||||
rg.addLayerGauge(
|
||||
RoutingLayerGauge.create( tech.getLayer( 'Metal3' ) # metal
|
||||
, RoutingLayerGauge.Vertical # preferred routing direction
|
||||
, RoutingLayerGauge.Horizontal # preferred routing direction
|
||||
, RoutingLayerGauge.Default # layer usage
|
||||
, 2 # depth
|
||||
, 0.0 # density (deprecated)
|
||||
|
@ -63,7 +64,7 @@ def _routing ():
|
|||
, u(0.0 ) )) # obstacle dW
|
||||
rg.addLayerGauge(
|
||||
RoutingLayerGauge.create( tech.getLayer( 'Metal4' ) # metal
|
||||
, RoutingLayerGauge.Horizontal # preferred routing direction
|
||||
, RoutingLayerGauge.Vertical # preferred routing direction
|
||||
, RoutingLayerGauge.Default # layer usage
|
||||
, 3 # depth
|
||||
, 0.0 # density (deprecated)
|
||||
|
@ -75,7 +76,7 @@ def _routing ():
|
|||
, u(0.0 ) )) # obstacle dW
|
||||
rg.addLayerGauge(
|
||||
RoutingLayerGauge.create( tech.getLayer( 'Metal5' ) # metal
|
||||
, RoutingLayerGauge.Vertical # preferred routing direction
|
||||
, RoutingLayerGauge.Horizontal # preferred routing direction
|
||||
, RoutingLayerGauge.Default # layer usage
|
||||
, 4 # depth
|
||||
, 0.0 # density (deprecated)
|
||||
|
@ -87,7 +88,7 @@ def _routing ():
|
|||
, u(0.0 ) )) # obstacle dW
|
||||
rg.addLayerGauge(
|
||||
RoutingLayerGauge.create( tech.getLayer( 'MetalTop' ) # metal
|
||||
, RoutingLayerGauge.Horizontal # preferred routing direction
|
||||
, RoutingLayerGauge.Vertical # preferred routing direction
|
||||
, RoutingLayerGauge.PowerSupply # layer usage
|
||||
, 5 # depth
|
||||
, 0.0 # density (deprecated)
|
||||
|
@ -161,7 +162,9 @@ def _routing ():
|
|||
cfg.anabatic.globalIterations = [ 1, 100 ]
|
||||
cfg.anabatic.gcell.displayMode = 1
|
||||
cfg.anabatic.gcell.displayMode = (("Boundary", 1), ("Density", 2))
|
||||
cfg.katana.disableStackedVias = True
|
||||
cfg.anabatic.netBuilderStyle = 'VH,3RL+'
|
||||
cfg.anabatic.routingStyle = StyleFlags.VH
|
||||
cfg.katana.disableStackedVias = False
|
||||
cfg.katana.hTracksReservedLocal = 4
|
||||
cfg.katana.hTracksReservedLocal = [0, 20]
|
||||
cfg.katana.vTracksReservedLocal = 3
|
||||
|
|
|
@ -80,20 +80,20 @@ def _setup_techno():
|
|||
setEnclosures( CONT, Poly2 , u(0.07) )
|
||||
setEnclosures( CONT, Metal1, u(0.12) )
|
||||
VIA12 = createVia( tech, 'VIA12', 'Metal1', 'Via1', 'Metal2', u(0.26) )
|
||||
setEnclosures( VIA12, Metal1, u(0.06) )
|
||||
setEnclosures( VIA12, Metal2, u(0.06) )
|
||||
setEnclosures( VIA12, Metal1, (u(0.06), u(0.00)) )
|
||||
setEnclosures( VIA12, Metal2, (u(0.06), u(0.01)) )
|
||||
VIA23 = createVia( tech, 'VIA23', 'Metal2', 'Via2', 'Metal3', u(0.26) )
|
||||
setEnclosures( VIA23, Metal2, u(0.06) )
|
||||
setEnclosures( VIA23, Metal3, u(0.06) )
|
||||
setEnclosures( VIA23, Metal2, (u(0.06), u(0.01)) )
|
||||
setEnclosures( VIA23, Metal3, (u(0.01), u(0.06)) )
|
||||
VIA34 = createVia( tech, 'VIA34', 'Metal3', 'Via3', 'Metal4', u(0.26) )
|
||||
setEnclosures( VIA34, Metal3, u(0.06) )
|
||||
setEnclosures( VIA34, Metal4, u(0.06) )
|
||||
setEnclosures( VIA34, Metal3, (u(0.01), u(0.06)) )
|
||||
setEnclosures( VIA34, Metal4, (u(0.06), u(0.01)) )
|
||||
VIA45 = createVia( tech, 'VIA45', 'Metal4', 'Via4', 'Metal5', u(0.26) )
|
||||
setEnclosures( VIA45, Metal4, u(0.06) )
|
||||
setEnclosures( VIA45, Metal5, u(0.06) )
|
||||
setEnclosures( VIA45, Metal4, (u(0.06), u(0.01)) )
|
||||
setEnclosures( VIA45, Metal5, (u(0.01), u(0.06)) )
|
||||
VIA5T = createVia( tech, 'VIA5T', 'Metal5', 'Via5', 'MetalTop', u(0.26) )
|
||||
setEnclosures( VIA5T, Metal5 , u(0.06) )
|
||||
setEnclosures( VIA5T, MetalTop, u(0.06) )
|
||||
setEnclosures( VIA5T, Metal5 , (u(0.01), u(0.06)) )
|
||||
setEnclosures( VIA5T, MetalTop, (u(0.06), u(0.01)) )
|
||||
|
||||
Border = createBL( tech, 'Border', BasicLayer.Material.other, gds2Layer=63 )
|
||||
|
||||
|
|
|
@ -110,8 +110,8 @@ namespace {
|
|||
inline int getNthRouting () const;
|
||||
inline void incNthRouting ();
|
||||
inline RoutingGauge* getRoutingGauge () const;
|
||||
inline void addPinSegment ( string name, Segment* );
|
||||
inline void clearPinSegments ();
|
||||
inline void addPinComponent ( string name, Component* );
|
||||
inline void clearPinComponents ();
|
||||
private:
|
||||
static int _unitsCbk ( lefrCallbackType_e, lefiUnits* , lefiUserData );
|
||||
static int _layerCbk ( lefrCallbackType_e, lefiLayer* , lefiUserData );
|
||||
|
@ -131,7 +131,7 @@ namespace {
|
|||
Net* _net;
|
||||
string _busBits;
|
||||
double _unitsMicrons;
|
||||
map< string, vector<Segment*> > _pinSegments;
|
||||
map< string, vector<Component*> > _pinComponents;
|
||||
static map<string,Layer*> _layerLut;
|
||||
vector<string> _unmatchedLayers;
|
||||
vector<string> _errors;
|
||||
|
@ -173,8 +173,8 @@ namespace {
|
|||
inline const vector<string>& LefParser::getErrors () const { return _errors; }
|
||||
inline void LefParser::pushError ( const string& error ) { _errors.push_back(error); }
|
||||
inline void LefParser::clearErrors () { return _errors.clear(); }
|
||||
inline void LefParser::addPinSegment ( string name, Segment* s ) { _pinSegments[name].push_back(s); }
|
||||
inline void LefParser::clearPinSegments () { _pinSegments.clear(); }
|
||||
inline void LefParser::addPinComponent ( string name, Component* comp ) { _pinComponents[name].push_back(comp); }
|
||||
inline void LefParser::clearPinComponents () { _pinComponents.clear(); }
|
||||
|
||||
|
||||
Library* LefParser::_mergeLibrary = nullptr;
|
||||
|
@ -520,6 +520,8 @@ namespace {
|
|||
points.push_back( Point( parser->fromUnitsMicrons(polygon->x[ipoint])
|
||||
, parser->fromUnitsMicrons(polygon->y[ipoint]) ));
|
||||
}
|
||||
points.push_back( Point( parser->fromUnitsMicrons(polygon->x[0])
|
||||
, parser->fromUnitsMicrons(polygon->y[0]) ));
|
||||
Rectilinear::create( blockageNet, blockageLayer, points );
|
||||
continue;
|
||||
}
|
||||
|
@ -577,7 +579,7 @@ namespace {
|
|||
|
||||
if (not isPad) parser->_pinStdPostProcess();
|
||||
else parser->_pinPadPostProcess();
|
||||
parser->clearPinSegments();
|
||||
parser->clearPinComponents();
|
||||
|
||||
cerr << " - " << cellName
|
||||
<< " " << DbU::getValueString(width) << " " << DbU::getValueString(height)
|
||||
|
@ -667,7 +669,7 @@ namespace {
|
|||
, parser->fromUnitsMicrons( r->yh )
|
||||
);
|
||||
}
|
||||
if (segment) parser->addPinSegment( pin->name(), segment );
|
||||
if (segment) parser->addPinComponent( pin->name(), segment );
|
||||
//cerr << " | " << segment << endl;
|
||||
continue;
|
||||
}
|
||||
|
@ -678,7 +680,10 @@ namespace {
|
|||
points.push_back( Point( parser->fromUnitsMicrons(polygon->x[ipoint])
|
||||
, parser->fromUnitsMicrons(polygon->y[ipoint]) ));
|
||||
}
|
||||
Rectilinear::create( net, layer, points );
|
||||
points.push_back( Point( parser->fromUnitsMicrons(polygon->x[0])
|
||||
, parser->fromUnitsMicrons(polygon->y[0]) ));
|
||||
Rectilinear* rectilinear = Rectilinear::create( net, layer, points );
|
||||
if (rectilinear) parser->addPinComponent( pin->name(), rectilinear );
|
||||
continue;
|
||||
}
|
||||
if (geoms->itemType(igeom) == lefiGeomClassE) {
|
||||
|
@ -722,20 +727,27 @@ namespace {
|
|||
const RoutingLayerGauge* gaugeMetal2 = _routingGauge->getLayerGauge( 1 );
|
||||
Box ab = _cell->getAbutmentBox();
|
||||
|
||||
//cerr << " @ _pinStdPostProcess" << endl;
|
||||
cerr << " @ _pinStdPostProcess" << endl;
|
||||
|
||||
for ( auto element : _pinSegments ) {
|
||||
string pinName = element.first;
|
||||
vector<Segment*>& segments = element.second;
|
||||
vector<Segment*> ongrids;
|
||||
for ( auto element : _pinComponents ) {
|
||||
string pinName = element.first;
|
||||
vector<Component*>& components = element.second;
|
||||
vector<Segment*> ongrids;
|
||||
|
||||
for ( Segment* segment : segments ) {
|
||||
bool isWide = (segment->getWidth() >= getMinTerminalWidth());
|
||||
for ( Component* component : components ) {
|
||||
Segment* segment = dynamic_cast<Segment*>( component );
|
||||
if (segment) {
|
||||
if (component->getNet()->isSupply()) continue;
|
||||
bool isWide = (segment->getWidth() >= getMinTerminalWidth());
|
||||
|
||||
//cerr << " > " << segment << endl;
|
||||
cerr << " > " << segment << endl;
|
||||
if (not isVH())
|
||||
cerr << "NOT isVH()" << endl;
|
||||
else
|
||||
cerr << "isVH()" << endl;
|
||||
|
||||
if (not segment->getNet()->isSupply()) {
|
||||
if (isVH() and (segment->getLayer()->getMask() == metal1->getMask())) {
|
||||
cerr << "isVH()" << endl;
|
||||
Vertical* v = dynamic_cast<Vertical*>( segment );
|
||||
if (v) {
|
||||
DbU::Unit nearestX = gaugeMetal2->getTrackPosition( ab.getXMin()
|
||||
|
@ -746,7 +758,7 @@ namespace {
|
|||
if (nearestX == v->getX()) {
|
||||
} else {
|
||||
DbU::Unit neighbor = nearestX
|
||||
+ ((nearestX > v->getX()) ? 1 : -1) * gaugeMetal2->getPitch();
|
||||
+ ((nearestX > v->getX()) ? 1 : -1) * gaugeMetal2->getPitch();
|
||||
|
||||
//cerr << " | X:" << DbU::getValueString(v->getX())
|
||||
// << " nearestX:" << DbU::getValueString(nearestX)
|
||||
|
@ -772,16 +784,67 @@ namespace {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isWide) ongrids.push_back( segment );
|
||||
if (isWide) ongrids.push_back( segment );
|
||||
}
|
||||
Rectilinear* rectilinear = dynamic_cast<Rectilinear*>( component );
|
||||
if (not (rectilinear->getLayer()->getMask() == metal1->getMask()))
|
||||
continue;
|
||||
|
||||
if (rectilinear) {
|
||||
cerr << " > " << rectilinear << endl;
|
||||
vector<Box> boxes;
|
||||
rectilinear->getAsRectangles( boxes );
|
||||
|
||||
if (component->getNet()->isSupply()) {
|
||||
ongrids.push_back( Horizontal::create( rectilinear->getNet()
|
||||
, rectilinear->getLayer()
|
||||
, boxes.front().getYCenter()
|
||||
, boxes.front().getHeight()
|
||||
, _cell->getAbutmentBox().getXMin()
|
||||
, _cell->getAbutmentBox().getXMax()
|
||||
)
|
||||
);
|
||||
} else {
|
||||
for ( const Box& box : boxes ) {
|
||||
DbU::Unit nearestX = gaugeMetal2->getTrackPosition( ab.getXMin()
|
||||
, ab.getXMax()
|
||||
, box.getXCenter()
|
||||
, Constant::Nearest );
|
||||
DbU::Unit xmin = std::min( box.getXMin(), nearestX - gaugeMetal2->getViaWidth()/2 );
|
||||
DbU::Unit xmax = std::max( box.getXMax(), nearestX + gaugeMetal2->getViaWidth()/2 );
|
||||
ongrids.push_back( Vertical::create( rectilinear->getNet()
|
||||
, rectilinear->getLayer()
|
||||
, (xmax+xmin)/2
|
||||
, xmax-xmin
|
||||
, box.getYMin()
|
||||
, box.getYMax()
|
||||
)
|
||||
);
|
||||
// DbU::Unit neighbor = nearestY
|
||||
// + ((nearestY > box.getYCenter()) ? 1 : -1) * gaugeMetal2->getPitch();
|
||||
|
||||
// if ( (box.getYMin() > neighbor)
|
||||
// or (box.getYMax() < neighbor) ) {
|
||||
// ongrids.push_back( Vertical::create( rectilinear->getNet()
|
||||
// , rectilinear->getLayer()
|
||||
// , box.getXCenter()
|
||||
// , box.getWidth()
|
||||
// , box.getYMin()
|
||||
// , box.getYMax()
|
||||
// )
|
||||
// );
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ongrids.empty()) {
|
||||
cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid."
|
||||
, pinName.c_str() ) << endl;
|
||||
for ( Segment* segment : segments ) {
|
||||
NetExternalComponents::setExternal( segment );
|
||||
for ( Component* component : components ) {
|
||||
NetExternalComponents::setExternal( component );
|
||||
}
|
||||
} else {
|
||||
for ( Segment* segment : ongrids ) {
|
||||
|
@ -797,10 +860,10 @@ namespace {
|
|||
Box ab = getCell()->getAbutmentBox();
|
||||
bool isCornerPad = (_cellGauge) and (_cellGauge->getSliceHeight() == _cellGauge->getSliceStep());
|
||||
|
||||
for ( auto element : _pinSegments ) {
|
||||
string pinName = element.first;
|
||||
vector<Segment*>& segments = element.second;
|
||||
vector<Segment*> ongrids;
|
||||
for ( auto element : _pinComponents ) {
|
||||
string pinName = element.first;
|
||||
vector<Component*>& segments = element.second;
|
||||
vector<Segment*> ongrids;
|
||||
|
||||
if (segments.empty()) continue;
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
# -*- explicit-buffer-name: "CMakeLists.txt<crlcore/src/ccore/cyclop>" -*-
|
||||
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
include_directories ( ${CRLCORE_SOURCE_DIR}/src/ccore
|
||||
${HURRICANE_INCLUDE_DIR}
|
||||
${UTILITIES_INCLUDE_DIR}
|
||||
|
|
|
@ -32,8 +32,6 @@
|
|||
-lutil
|
||||
)
|
||||
|
||||
find_package (Python 3 COMPONENTS Interpreter Development.Module )
|
||||
|
||||
add_definitions( -DCORIOLIS_TOP="${CORIOLIS_TOP}"
|
||||
-DSYS_CONF_DIR="${SYS_CONF_DIR}"
|
||||
-DPYTHON_SITE_PACKAGES="${PYTHON_SITE_PACKAGES}"
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
# -*- explicit-buffer-name: "CMakeLists.txt<crlcore/src/x2y> -*-
|
||||
|
||||
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
include_directories ( ${CRLCORE_SOURCE_DIR}/src/ccore
|
||||
${HURRICANE_INCLUDE_DIR}
|
||||
${UTILITIES_INCLUDE_DIR}
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
|
||||
set_cmake_policies()
|
||||
setup_boost(program_options)
|
||||
setup_python()
|
||||
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
#find_package(KATABATIC REQUIRED)
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
${Boost_INCLUDE_DIRS}
|
||||
${Python_INCLUDE_DIRS}
|
||||
)
|
||||
find_package (Python 3 COMPONENTS Interpreter Development.Module )
|
||||
set( includes etesian/Configuration.h
|
||||
etesian/Placement.h
|
||||
etesian/FeedCells.h
|
||||
|
|
|
@ -709,6 +709,7 @@ namespace Etesian {
|
|||
cmess1 << " o Converting \"" << getCell()->getName() << "\" into Coloquinte." << endl;
|
||||
cmess1 << ::Dots::asString(" - H-pitch" , DbU::getValueString(hpitch)) << endl;
|
||||
cmess1 << ::Dots::asString(" - V-pitch" , DbU::getValueString(vpitch)) << endl;
|
||||
cmess1 << ::Dots::asString(" - Slice height" , DbU::getValueString(sliceHeight)) << endl;
|
||||
if (isFlexLib)
|
||||
cmess1 << ::Dots::asString(" - Using patches for" , "\"FlexLib\"") << endl;
|
||||
cmess2 << " o Looking through the hierarchy." << endl;
|
||||
|
@ -749,11 +750,16 @@ namespace Etesian {
|
|||
}
|
||||
}
|
||||
}
|
||||
_surface = new coloquinte::Rectangle( (int)(topAb.getXMin() / hpitch)
|
||||
, (int)(topAb.getXMax() / hpitch)
|
||||
, (int)(topAb.getYMin() / vpitch)
|
||||
, (int)(topAb.getYMax() / vpitch)
|
||||
);
|
||||
|
||||
for ( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) ) {
|
||||
++instancesNb;
|
||||
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
|
||||
Box instanceAb = instance->getAbutmentBox();
|
||||
Box instanceAb = _bloatCells.getAb( occurrence );
|
||||
string masterName = getString( instance->getMasterCell()->getName() );
|
||||
DbU::Unit length = (instanceAb.getHeight() / sliceHeight) * instanceAb.getWidth();
|
||||
if (af->isRegister(masterName)) {
|
||||
|
@ -843,10 +849,10 @@ namespace Etesian {
|
|||
}
|
||||
}
|
||||
|
||||
// Compute the space margin from the row length computed earlier
|
||||
double spaceMargin = (double) (totalLength - usedLength) / usedLength;
|
||||
double densityVariation = getDensityVariation();
|
||||
double bloatFactor = 1.0 + std::max(spaceMargin - densityVariation, 0.0);
|
||||
// Compute a bloat factor to be reach 1 - densityVariation density
|
||||
double bloatFactor = std::max(1.0, (1.0 - getDensityVariation()) * totalLength / usedLength);
|
||||
// Limit the maximum size of cells after bloat to avoid placement issues
|
||||
int maxBloatSize = _surface->width() / 8;
|
||||
if (bloatFactor != 1.0) {
|
||||
ostringstream bf;
|
||||
bf << fixed << setprecision(2) << bloatFactor << "%";
|
||||
|
@ -886,7 +892,7 @@ namespace Etesian {
|
|||
++xsize;
|
||||
|
||||
// Take bloat into account to compute the size
|
||||
xsize *= bloatFactor;
|
||||
xsize = std::max(xsize, std::min(maxBloatSize, (int) (xsize * bloatFactor)));
|
||||
|
||||
cellX[instanceId] = xpos;
|
||||
cellY[instanceId] = ypos;
|
||||
|
@ -1032,11 +1038,6 @@ namespace Etesian {
|
|||
if (_bloatCells.getSelected()->getName() != "disabled")
|
||||
cmess2 << stdCellSizes.toString(1) << endl;
|
||||
|
||||
_surface = new coloquinte::Rectangle( (int)(topAb.getXMin() / hpitch)
|
||||
, (int)(topAb.getXMax() / hpitch)
|
||||
, (int)(topAb.getYMin() / vpitch)
|
||||
, (int)(topAb.getYMax() / vpitch)
|
||||
);
|
||||
_circuit->setupRows(*_surface, rowHeight);
|
||||
_circuit->check();
|
||||
_placementLB = new coloquinte::PlacementSolution ();
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
set_cmake_policies()
|
||||
check_distribution()
|
||||
setup_sysconfdir( "${CMAKE_INSTALL_PREFIX}" )
|
||||
setup_python()
|
||||
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
find_package(CORIOLIS REQUIRED)
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
${CONFIGURATION_INCLUDE_DIR}
|
||||
${Python_INCLUDE_DIRS}
|
||||
)
|
||||
find_package (Python 3 COMPONENTS Interpreter Development.Module )
|
||||
|
||||
set( includes flute.h
|
||||
dl.h
|
||||
|
|
|
@ -18,9 +18,9 @@
|
|||
set_cmake_policies()
|
||||
setup_boost(program_options)
|
||||
setup_qt()
|
||||
setup_python()
|
||||
|
||||
find_package(Libexecinfo REQUIRED)
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(LEFDEF REQUIRED)
|
||||
find_package(FLUTE REQUIRED)
|
||||
|
|
|
@ -20,11 +20,11 @@
|
|||
cmake_policy(SET CMP0054 NEW)
|
||||
setup_boost(program_options)
|
||||
setup_qt()
|
||||
setup_python()
|
||||
|
||||
find_package(BZip2 REQUIRED)
|
||||
find_package(BISON REQUIRED)
|
||||
find_package(FLEX REQUIRED)
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(Libexecinfo REQUIRED)
|
||||
if (USE_LIBBFD)
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
${Boost_INCLUDE_DIRS}
|
||||
${Python_INCLUDE_DIRS}
|
||||
)
|
||||
find_package (Python 3 COMPONENTS Interpreter Development.Module )
|
||||
set( pyCpps ProxyProperty.cpp
|
||||
PythonAttributes.cpp
|
||||
PyBreakpoint.cpp
|
||||
|
|
|
@ -14,10 +14,10 @@
|
|||
set_cmake_policies()
|
||||
#setup_apple()
|
||||
setup_boost(program_options)
|
||||
setup_python()
|
||||
|
||||
set(QT_USE_QTXML "true")
|
||||
find_package(Qt4 REQUIRED)
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
find_package(CORIOLIS REQUIRED)
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
check_distribution()
|
||||
|
||||
setup_sysconfdir("${CMAKE_INSTALL_PREFIX}")
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
setup_python()
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
find_package(CORIOLIS REQUIRED)
|
||||
|
|
|
@ -18,9 +18,9 @@
|
|||
set_cmake_policies()
|
||||
setup_boost(program_options)
|
||||
setup_qt()
|
||||
setup_python()
|
||||
|
||||
find_package(Libexecinfo REQUIRED)
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(LEFDEF REQUIRED)
|
||||
find_package(FLUTE REQUIRED)
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
${Boost_INCLUDE_DIRS}
|
||||
${Python_INCLUDE_DIRS}
|
||||
)
|
||||
find_package (Python 3 COMPONENTS Interpreter Development.Module )
|
||||
set( includes katana/Constants.h
|
||||
katana/Block.h
|
||||
katana/TrackCost.h
|
||||
|
|
|
@ -76,6 +76,16 @@ namespace {
|
|||
cdebug_tabw(159,-1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (segment->isNonPrefOnVSmall()) {
|
||||
cdebug_log(159,0) << "Infinite cost from (NonPref on VSmall): " << segment << endl;
|
||||
cost.setInfinite ();
|
||||
cost.setOverlap ();
|
||||
cost.setHardOverlap();
|
||||
cost.setBlockage ();
|
||||
cdebug_tabw(159,-1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (cost.getInterval().getVMax() > intersect.getVMax()) cost.setLeftOverlap();
|
||||
|
|
|
@ -152,6 +152,7 @@ namespace Katana {
|
|||
bool TrackElement::isAnalog () const { return false; }
|
||||
bool TrackElement::isWide () const { return false; }
|
||||
bool TrackElement::isNonPref () const { return false; }
|
||||
bool TrackElement::isNonPrefOnVSmall () const { return false; }
|
||||
bool TrackElement::isShortNet () const { return false; }
|
||||
// Predicates.
|
||||
bool TrackElement::hasSymmetric () const { return false; }
|
||||
|
|
|
@ -195,6 +195,7 @@ namespace Katana {
|
|||
bool TrackSegment::isWide () const { return _base->isWide(); }
|
||||
bool TrackSegment::isShortNet () const { return _base->isShortNet(); }
|
||||
bool TrackSegment::isPriorityLocked () const { return _flags & PriorityLocked; }
|
||||
bool TrackSegment::isNonPrefOnVSmall () const { return _base->isNonPrefOnVSmall(); }
|
||||
// Predicates.
|
||||
bool TrackSegment::hasSymmetric () const { return _symmetric != NULL; }
|
||||
// Accessors.
|
||||
|
|
|
@ -106,6 +106,7 @@ namespace Katana {
|
|||
virtual bool isVertical () const = 0;
|
||||
virtual bool isWide () const;
|
||||
virtual bool isNonPref () const;
|
||||
virtual bool isNonPrefOnVSmall () const;
|
||||
virtual bool isUnbreakable () const;
|
||||
virtual bool isLocal () const;
|
||||
virtual bool isGlobal () const;
|
||||
|
|
|
@ -82,6 +82,7 @@ namespace Katana {
|
|||
virtual bool isAnalog () const;
|
||||
virtual bool isWide () const;
|
||||
virtual bool isShortNet () const;
|
||||
virtual bool isNonPrefOnVSmall () const;
|
||||
virtual bool isPriorityLocked () const;
|
||||
// Predicates.
|
||||
virtual bool hasSymmetric () const;
|
||||
|
|
|
@ -14,11 +14,11 @@
|
|||
set_cmake_policies()
|
||||
setup_sysconfdir("${CMAKE_INSTALL_PREFIX}")
|
||||
setup_boost(program_options)
|
||||
setup_python()
|
||||
|
||||
if (USE_LIBBFD)
|
||||
find_package(Libbfd)
|
||||
endif()
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
find_package(CORIOLIS REQUIRED)
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
list(INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/")
|
||||
find_package(Bootstrap REQUIRED)
|
||||
setup_project_paths(CORIOLIS)
|
||||
setup_python()
|
||||
|
||||
find_package(Bootstrap REQUIRED)
|
||||
set_cmake_policies()
|
||||
|
@ -19,7 +20,6 @@
|
|||
cmake_policy(SET CMP0002 OLD)
|
||||
setup_sysconfdir("${CMAKE_INSTALL_PREFIX}")
|
||||
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
find_package(CORIOLIS REQUIRED)
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
set_cmake_policies()
|
||||
setup_boost()
|
||||
setup_qt()
|
||||
setup_python()
|
||||
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development)
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
find_package(CORIOLIS REQUIRED)
|
||||
|
|
|
@ -17,9 +17,9 @@
|
|||
set_cmake_policies()
|
||||
setup_boost(program_options)
|
||||
setup_qt()
|
||||
setup_python()
|
||||
|
||||
find_package(Libexecinfo REQUIRED)
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(LEFDEF REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
|
|
|
@ -19,12 +19,12 @@
|
|||
setup_sysconfdir("${CMAKE_INSTALL_PREFIX}")
|
||||
setup_boost(program_options)
|
||||
setup_qt()
|
||||
setup_python()
|
||||
|
||||
if (USE_LIBBFD)
|
||||
find_package(Libbfd)
|
||||
endif()
|
||||
find_package(BZip2 REQUIRED)
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(LEFDEF REQUIRED)
|
||||
find_package(COLOQUINTE)
|
||||
|
|
|
@ -21,13 +21,13 @@
|
|||
setup_sysconfdir("${CMAKE_INSTALL_PREFIX}")
|
||||
setup_boost(program_options)
|
||||
setup_qt()
|
||||
setup_python()
|
||||
|
||||
if (USE_LIBBFD)
|
||||
find_package(Libbfd)
|
||||
endif()
|
||||
find_package(Libexecinfo REQUIRED)
|
||||
find_package(BZip2 REQUIRED)
|
||||
find_package(Python 3 REQUIRED COMPONENTS Interpreter Development.Module )
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(LEFDEF)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
|
|
Loading…
Reference in New Issue