Minor adjustements for analog device checker (test of AMS c35b4).

* Change: In CRL::GdsStream, no longer export empty Cells as structures,
    to avoid empty cells in Cadence. To prevent meta-transistors to be
    exported as real physical objects.
      Also put a hard-coded test to prevent exporting "control_r" model
    which is made of AMS standard cells for "amsOTA".
* Change: In CRL/PyRoutingGauge, export the isHV() and isVH() methods so
    the Stack can access it.
* Change: In Hurricane/PyCellViewer, export the removeHistory() method.
    When a Cell is deleted, it must be also removed from the editor
    history. This should be take care of automatically, but for now
    we make it manually through scripts.
* Bug: In Anabatic::NetBuilder::doRp_accessAnalog(), the gauge offset
    was not taken into account when creating initial Contact on
    RoutingPad. The program self corrected afterwards, but with the
    display of a disgraceful message.
* Change: In Anabatic::Configuration and Session, export the gauge offsets.
This commit is contained in:
Jean-Paul Chaput 2018-09-20 18:24:30 +02:00
parent 152276ddbb
commit b53511ea83
11 changed files with 253 additions and 93 deletions

View File

@ -984,7 +984,7 @@ namespace Anabatic {
if (gaugeKind < 3) {
for ( Net* net : getCell()->getNets() ) {
if (NetRoutingExtension::isShortNet(net)) {
AutoSegment::setShortNetMode( true );
//AutoSegment::setShortNetMode( true );
++shortNets;
}
if (NetRoutingExtension::isAutomaticGlobalRoute(net)) {

View File

@ -829,23 +829,26 @@ namespace Anabatic {
size_t rpDepth = Session::getLayerDepth( rpLayer );
DbU::Unit viaSide = Session::getViaWidth ( rpDepth );
Point position = rp->getCenter();
Point onGrid = Session::getNearestGridPoint( position, gcell->getConstraintBox() );
position.translate( -Session::getDVerticalOffset(), -Session::getDHorizontalOffset() );
AutoContact* contact = AutoContactTerminal::create( gcell, rp, rpLayer, position, viaSide, viaSide );
Point onGrid = Session::getNearestGridPoint( position, gcell->getConstraintBox() );
AutoContact* contact = AutoContactTerminal::create( gcell, rp, rpLayer, position, viaSide, viaSide );
if (position != onGrid) {
cerr << Bug( "NetBuilder::doRp_AccessAnalog(): RoutingPad is not under any grid point.\n"
" %s\n"
" Using nearest grid point: %s"
" %s shifted to nearest grid point %s"
, getString(rp).c_str()
, getString(position).c_str()
, getString(onGrid).c_str()
) << endl;
contact->forceOnGrid( onGrid );
}
if (rpDepth != 1) {
cerr << Bug( "NetBuilder::doRp_AccessAnalog(): RoutingPad must be in METAL2 layer.\n"
if (rpDepth != Session::getDHorizontalDepth()) {
cerr << Bug( "NetBuilder::doRp_AccessAnalog(): RoutingPad must be in %s layer.\n"
" %s"
, getString(Session::getDHorizontalLayer()->getName()).c_str()
, getString(rp).c_str()
) << endl;
}

View File

@ -363,6 +363,7 @@ namespace Anabatic {
, ab.getXMax()
, p.getX()
, Constant::Nearest ) );
if (x < constraint.getXMin()) x += lg->getPitch();
if (x > constraint.getXMax()) x -= lg->getPitch();

View File

@ -59,75 +59,77 @@ namespace Anabatic {
static const size_t ndepth = (size_t)-1;
public:
// Constructor & Destructor.
Configuration ( const CellGauge* cg=NULL, const RoutingGauge* rg=NULL );
Configuration ( const Configuration& );
virtual ~Configuration ();
virtual Configuration* clone () const;
Configuration ( const CellGauge* cg=NULL, const RoutingGauge* rg=NULL );
Configuration ( const Configuration& );
virtual ~Configuration ();
virtual Configuration* clone () const;
// Methods.
bool isGMetal ( const Layer* ) const;
bool isGContact ( const Layer* ) const;
bool isTwoMetals () const;
bool isHV () const;
bool isVH () const;
const Layer* getGContactLayer () const;
const Layer* getGHorizontalLayer () const;
const Layer* getGVerticalLayer () const;
inline size_t getGVerticalDepth () const;
inline DbU::Unit getGVerticalPitch () const;
inline size_t getGHorizontalDepth () const;
inline DbU::Unit getGHorizontalPitch () const;
inline size_t getDVerticalDepth () const;
inline const Layer* getDVerticalLayer () const;
inline DbU::Unit getDVerticalWidth () const;
inline DbU::Unit getDVerticalPitch () const;
inline size_t getDHorizontalDepth () const;
inline const Layer* getDHorizontalLayer () const;
inline DbU::Unit getDHorizontalWidth () const;
inline DbU::Unit getDHorizontalPitch () const;
inline size_t getDContactDepth () const;
inline const Layer* getDContactLayer () const;
inline DbU::Unit getDContactWidth () const;
inline DbU::Unit getDContactPitch () const;
size_t getDepth () const;
size_t getAllowedDepth () const;
size_t getLayerDepth ( const Layer* ) const;
CellGauge* getCellGauge () const;
RoutingGauge* getRoutingGauge () const;
RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
const Layer* getRoutingLayer ( size_t depth ) const;
Layer* getContactLayer ( size_t depth ) const;
DbU::Unit getSliceHeight () const;
DbU::Unit getSliceStep () const;
DbU::Unit getPitch ( size_t depth, Flags flags ) const;
DbU::Unit getOffset ( size_t depth ) const;
DbU::Unit getWireWidth ( size_t depth ) const;
DbU::Unit getExtensionCap ( size_t depth ) const;
Flags getDirection ( size_t depth ) const;
DbU::Unit getPitch ( const Layer*, Flags flags ) const;
DbU::Unit getOffset ( const Layer* ) const;
DbU::Unit getWireWidth ( const Layer* ) const;
DbU::Unit getExtensionCap ( const Layer* ) const;
Flags getDirection ( const Layer* ) const;
float getSaturateRatio () const;
size_t getSaturateRp () const;
DbU::Unit getGlobalThreshold () const;
void setAllowedDepth ( size_t );
void setSaturateRatio ( float );
void setSaturateRp ( size_t );
void setGlobalThreshold ( DbU::Unit );
DbU::Unit getEdgeLength () const;
DbU::Unit getEdgeWidth () const;
float getEdgeCostH () const;
float getEdgeCostK () const;
float getEdgeHInc () const;
float getEdgeHScaling () const;
int getGlobalIterations () const;
DbU::Unit isOnRoutingGrid ( RoutingPad* ) const;
bool selectRpComponent ( RoutingPad* ) const;
virtual void print ( Cell* ) const;
virtual Record* _getRecord () const;
virtual string _getString () const;
virtual string _getTypeName () const;
bool isGMetal ( const Layer* ) const;
bool isGContact ( const Layer* ) const;
bool isTwoMetals () const;
bool isHV () const;
bool isVH () const;
const Layer* getGContactLayer () const;
const Layer* getGHorizontalLayer () const;
const Layer* getGVerticalLayer () const;
inline size_t getGVerticalDepth () const;
inline DbU::Unit getGVerticalPitch () const;
inline size_t getGHorizontalDepth () const;
inline DbU::Unit getGHorizontalPitch () const;
inline size_t getDVerticalDepth () const;
inline const Layer* getDVerticalLayer () const;
inline DbU::Unit getDVerticalWidth () const;
inline DbU::Unit getDVerticalPitch () const;
inline DbU::Unit getDVerticalOffset () const;
inline size_t getDHorizontalDepth () const;
inline const Layer* getDHorizontalLayer () const;
inline DbU::Unit getDHorizontalWidth () const;
inline DbU::Unit getDHorizontalPitch () const;
inline DbU::Unit getDHorizontalOffset () const;
inline size_t getDContactDepth () const;
inline const Layer* getDContactLayer () const;
inline DbU::Unit getDContactWidth () const;
inline DbU::Unit getDContactPitch () const;
size_t getDepth () const;
size_t getAllowedDepth () const;
size_t getLayerDepth ( const Layer* ) const;
CellGauge* getCellGauge () const;
RoutingGauge* getRoutingGauge () const;
RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
const Layer* getRoutingLayer ( size_t depth ) const;
Layer* getContactLayer ( size_t depth ) const;
DbU::Unit getSliceHeight () const;
DbU::Unit getSliceStep () const;
DbU::Unit getPitch ( size_t depth, Flags flags ) const;
DbU::Unit getOffset ( size_t depth ) const;
DbU::Unit getWireWidth ( size_t depth ) const;
DbU::Unit getExtensionCap ( size_t depth ) const;
Flags getDirection ( size_t depth ) const;
DbU::Unit getPitch ( const Layer*, Flags flags ) const;
DbU::Unit getOffset ( const Layer* ) const;
DbU::Unit getWireWidth ( const Layer* ) const;
DbU::Unit getExtensionCap ( const Layer* ) const;
Flags getDirection ( const Layer* ) const;
float getSaturateRatio () const;
size_t getSaturateRp () const;
DbU::Unit getGlobalThreshold () const;
void setAllowedDepth ( size_t );
void setSaturateRatio ( float );
void setSaturateRp ( size_t );
void setGlobalThreshold ( DbU::Unit );
DbU::Unit getEdgeLength () const;
DbU::Unit getEdgeWidth () const;
float getEdgeCostH () const;
float getEdgeCostK () const;
float getEdgeHInc () const;
float getEdgeHScaling () const;
int getGlobalIterations () const;
DbU::Unit isOnRoutingGrid ( RoutingPad* ) const;
bool selectRpComponent ( RoutingPad* ) const;
virtual void print ( Cell* ) const;
virtual Record* _getRecord () const;
virtual string _getString () const;
virtual string _getTypeName () const;
protected:
// Attributes.
const Layer* _gmetalh;
@ -158,22 +160,24 @@ namespace Anabatic {
};
inline size_t Configuration::getGHorizontalDepth () const { return _gdepthh; }
inline size_t Configuration::getGVerticalDepth () const { return _gdepthv; }
inline DbU::Unit Configuration::getGHorizontalPitch () const { return getPitch( getGHorizontalDepth(), Flags::NoFlags ); }
inline DbU::Unit Configuration::getGVerticalPitch () const { return getPitch( getGVerticalDepth (), Flags::NoFlags ); }
inline size_t Configuration::getDVerticalDepth () const { return _ddepthv; }
inline const Layer* Configuration::getDVerticalLayer () const { return getRoutingLayer( getDVerticalDepth() ); }
inline DbU::Unit Configuration::getDVerticalWidth () const { return getWireWidth ( getDVerticalDepth() ); }
inline DbU::Unit Configuration::getDVerticalPitch () const { return getPitch ( getDVerticalDepth(), Flags::NoFlags ); }
inline size_t Configuration::getDHorizontalDepth () const { return _ddepthh; }
inline const Layer* Configuration::getDHorizontalLayer () const { return getRoutingLayer( getDHorizontalDepth() ); }
inline DbU::Unit Configuration::getDHorizontalWidth () const { return getWireWidth ( getDHorizontalDepth() ); }
inline DbU::Unit Configuration::getDHorizontalPitch () const { return getPitch ( getDHorizontalDepth(), Flags::NoFlags ); }
inline size_t Configuration::getDContactDepth () const { return _ddepthc; }
inline const Layer* Configuration::getDContactLayer () const { return getContactLayer( getDContactDepth() ); }
inline DbU::Unit Configuration::getDContactWidth () const { return getWireWidth ( getDContactDepth() ); }
inline DbU::Unit Configuration::getDContactPitch () const { return getPitch ( getDContactDepth(), Flags::NoFlags ); }
inline size_t Configuration::getGHorizontalDepth () const { return _gdepthh; }
inline size_t Configuration::getGVerticalDepth () const { return _gdepthv; }
inline DbU::Unit Configuration::getGHorizontalPitch () const { return getPitch( getGHorizontalDepth(), Flags::NoFlags ); }
inline DbU::Unit Configuration::getGVerticalPitch () const { return getPitch( getGVerticalDepth (), Flags::NoFlags ); }
inline size_t Configuration::getDVerticalDepth () const { return _ddepthv; }
inline const Layer* Configuration::getDVerticalLayer () const { return getRoutingLayer( getDVerticalDepth() ); }
inline DbU::Unit Configuration::getDVerticalWidth () const { return getWireWidth ( getDVerticalDepth() ); }
inline DbU::Unit Configuration::getDVerticalPitch () const { return getPitch ( getDVerticalDepth(), Flags::NoFlags ); }
inline DbU::Unit Configuration::getDVerticalOffset () const { return getOffset ( getDVerticalDepth() ); }
inline size_t Configuration::getDHorizontalDepth () const { return _ddepthh; }
inline const Layer* Configuration::getDHorizontalLayer () const { return getRoutingLayer( getDHorizontalDepth() ); }
inline DbU::Unit Configuration::getDHorizontalWidth () const { return getWireWidth ( getDHorizontalDepth() ); }
inline DbU::Unit Configuration::getDHorizontalPitch () const { return getPitch ( getDHorizontalDepth(), Flags::NoFlags ); }
inline DbU::Unit Configuration::getDHorizontalOffset () const { return getOffset ( getDHorizontalDepth() ); }
inline size_t Configuration::getDContactDepth () const { return _ddepthc; }
inline const Layer* Configuration::getDContactLayer () const { return getContactLayer( getDContactDepth() ); }
inline DbU::Unit Configuration::getDContactWidth () const { return getWireWidth ( getDContactDepth() ); }
inline DbU::Unit Configuration::getDContactPitch () const { return getPitch ( getDContactDepth(), Flags::NoFlags ); }
} // Anabatic namespace.

View File

@ -96,10 +96,12 @@ namespace Anabatic {
static inline const Layer* getDVerticalLayer ();
static inline DbU::Unit getDVerticalWidth ();
static inline DbU::Unit getDVerticalPitch ();
static inline DbU::Unit getDVerticalOffset ();
static inline size_t getDHorizontalDepth ();
static inline const Layer* getDHorizontalLayer ();
static inline DbU::Unit getDHorizontalWidth ();
static inline DbU::Unit getDHorizontalPitch ();
static inline DbU::Unit getDHorizontalOffset ();
static inline size_t getDContactDepth ();
static inline const Layer* getDContactLayer ();
static inline DbU::Unit getDContactWidth ();
@ -232,10 +234,12 @@ namespace Anabatic {
inline const Layer* Session::getDVerticalLayer () { return getConfiguration()->getDVerticalLayer(); }
inline DbU::Unit Session::getDVerticalWidth () { return getConfiguration()->getDVerticalWidth(); }
inline DbU::Unit Session::getDVerticalPitch () { return getConfiguration()->getDVerticalPitch(); }
inline DbU::Unit Session::getDVerticalOffset () { return getConfiguration()->getDVerticalOffset(); }
inline size_t Session::getDHorizontalDepth () { return getConfiguration()->getDHorizontalDepth(); }
inline const Layer* Session::getDHorizontalLayer () { return getConfiguration()->getDHorizontalLayer(); }
inline DbU::Unit Session::getDHorizontalWidth () { return getConfiguration()->getDHorizontalWidth(); }
inline DbU::Unit Session::getDHorizontalPitch () { return getConfiguration()->getDHorizontalPitch(); }
inline DbU::Unit Session::getDHorizontalOffset () { return getConfiguration()->getDHorizontalOffset(); }
inline size_t Session::getDContactDepth () { return getConfiguration()->getDContactDepth(); }
inline const Layer* Session::getDContactLayer () { return getConfiguration()->getDContactLayer(); }
inline DbU::Unit Session::getDContactWidth () { return getConfiguration()->getDContactWidth(); }

View File

@ -225,7 +225,6 @@ namespace CRL {
long index;
divide ( position-start, index, modulo );
cdebug_log(100,0) << "index := " << index << endl;
if ( index < 0 ) {

View File

@ -8,7 +8,7 @@
// | G D S I I / Hurricane Interface |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Module : "./gds/GdsDriver.cpp" |
// +-----------------------------------------------------------------+
@ -51,6 +51,17 @@ namespace {
using namespace std;
bool hasLayout ( const Cell* cell )
{
for ( Net* net : cell->getNets() ) {
for ( Component* component : net->getComponents() ) {
if (dynamic_cast<Plug*>(component) == NULL) return true;
}
}
return false;
}
// -------------------------------------------------------------------
// Class : "::DepthOrder".
@ -545,6 +556,10 @@ namespace {
GdsStream& GdsStream::operator<< ( const Cell* cell )
{
// Temporay patch for "amsOTA".
if (cell->getName() == "control_r") return *this;
if (not hasLayout(cell)) return *this;
time_t t = time( 0 );
tm* now = localtime( &t );
@ -566,6 +581,9 @@ namespace {
_ostream << STRNAME(cell->getName());
for ( Instance* instance : cell->getInstances() ) {
if (instance->getMasterCell()->getName() == "control_r") continue;
if (not hasLayout(instance->getMasterCell())) continue;
if (instance->getPlacementStatus() == Instance::PlacementStatus::UNPLACED) continue;
(*this) << SREF;

View File

@ -26,6 +26,7 @@
-DPYTHON_SITE_PACKAGES="${PYTHON_SITE_PACKAGES}"
)
set( pyConstCpps PyConstant.cpp )
set( pyCpps PyCRL.cpp
PyBanner.cpp
PyCatalog.cpp
@ -78,3 +79,10 @@
"${depLibs}"
include/coriolis2/crlcore
)
add_python_module( "${pyConstCpps}"
"crlcore/PyRoutingLayerGauge.h"
"pycrlconst;1.0;1"
Constant
"${depLibs}"
include/coriolis2/crlcore
)

View File

@ -0,0 +1,98 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC 2018-2018, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | Alliance / Hurricane Interface |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Module : "./PyConstant.cpp" |
// +-----------------------------------------------------------------+
#include "hurricane/isobar/PyHurricane.h"
#include "crlcore/PyRoutingLayerGauge.h"
namespace Constant {
using std::cerr;
using std::endl;
using std::string;
using Hurricane::tab;
using Hurricane::Exception;
using Hurricane::Bug;
using Hurricane::Error;
using Hurricane::Warning;
using Isobar::ProxyProperty;
using Isobar::ProxyError;
using Isobar::ConstructorError;
using Isobar::HurricaneError;
using Isobar::HurricaneWarning;
using Isobar::__cs;
#if !defined(__PYTHON_MODULE__)
// +=================================================================+
// | "PyConstant" Shared Library Code Part |
// +=================================================================+
# else // End of PyHurricane Shared Library Code Part.
// +=================================================================+
// | "PyConstant" Python Module Code Part |
// +=================================================================+
extern "C" {
static void LoadConstants ( PyObject* dictionnary ) {
PyObject* constant;
LoadObjectConstant( dictionnary, Constant::Horizontal, "Horizontal" )
LoadObjectConstant( dictionnary, Constant::Vertical , "Vertical" )
LoadObjectConstant( dictionnary, Constant::Default , "Default" )
LoadObjectConstant( dictionnary, Constant::PinOnly , "PinOnly" )
LoadObjectConstant( dictionnary, Constant::Superior , "Superior" )
LoadObjectConstant( dictionnary, Constant::Inferior , "Inferior" )
LoadObjectConstant( dictionnary, Constant::Nearest , "Nearest" )
LoadObjectConstant( dictionnary, Constant::Exact , "Exact" )
}
static PyMethodDef PyConstant_Methods[] =
{ {NULL, NULL, 0, NULL} /* sentinel */
};
DL_EXPORT(void) initConstant () {
cdebug_log(30,0) << "initConstant()" << endl;
PyObject* module = Py_InitModule( "Constant", PyConstant_Methods );
if (module == NULL) {
cerr << "[ERROR]\n"
<< " Failed to initialize Constant module." << endl;
return;
}
PyObject* dictionnary = PyModule_GetDict( module );
LoadConstants( dictionnary );
cdebug_log(30,0) << "Constant.so loaded " << (void*)&typeid(string) << endl;
}
} // extern "C".
#endif // Python Module Code Part.
} // Constant namespace.

View File

@ -360,6 +360,8 @@ extern "C" {
accessorVectorFromVoid(getLayerGauges,PyRoutingGauge,RoutingGauge,RoutingLayerGauge)
DirectGetBoolAttribute(PyRoutingGauge_isSymbolic ,isSymbolic ,PyRoutingGauge,RoutingGauge)
DirectSetBoolAttribute(PyRoutingGauge_setSymbolic,setSymbolic,PyRoutingGauge,RoutingGauge)
DirectGetBoolAttribute(PyRoutingGauge_isHV ,isHV ,PyRoutingGauge,RoutingGauge)
DirectGetBoolAttribute(PyRoutingGauge_isVH ,isVH ,PyRoutingGauge,RoutingGauge)
// Standart Destroy (Attribute).
@ -368,8 +370,12 @@ extern "C" {
PyMethodDef PyRoutingGauge_Methods[] =
{ { "create" , (PyCFunction)PyRoutingGauge_create , METH_VARARGS|METH_STATIC
, "Create a new RoutingGauge." }
, { "isSymbolic" , (PyCFunction)PyRoutingGauge_isSymbolic , METH_NOARGS
, { "isSymbolic" , (PyCFunction)PyRoutingGauge_isSymbolic , METH_NOARGS
, "The RoutingGauge is for symbolic technology." }
, { "isHV" , (PyCFunction)PyRoutingGauge_isHV , METH_NOARGS
, "The first routing layer (metal2) is horizontal." }
, { "isVH" , (PyCFunction)PyRoutingGauge_isVH , METH_NOARGS
, "The first routing layer (metal2) is vertical." }
, { "getName" , (PyCFunction)PyRoutingGauge_getName , METH_NOARGS
, "Return the maximum depth of the RoutingGauge." }
, { "getTechnology" , (PyCFunction)PyRoutingGauge_getTechnology , METH_NOARGS

View File

@ -254,6 +254,23 @@ extern "C" {
}
static PyObject* PyCellViewer_removeHistory ( PyCellViewer* self, PyObject* args )
{
cdebug_log(20,0) << "PyCellViewer_removeHistory ()" << endl;
HTRY
METHOD_HEAD("CellViewer.removeHistory()")
PyCell* cell;
if ( not ParseOneArg("CellViewer.removeHistory()",args,CELL_ARG,(PyObject**)&cell) ) {
return NULL;
}
cw->removeHistory ( PYCELL_O(cell) );
HCATCH
Py_RETURN_NONE;
}
// ---------------------------------------------------------------
// PyCellViewer Attribute Method table.
@ -280,6 +297,8 @@ extern "C" {
, "Triggers a full redraw of the visible area." }
, { "refresh" , (PyCFunction)PyCellViewer_refresh , METH_NOARGS
, "Fit the contents to the viewer's visible area." }
, { "removeHistory" , (PyCFunction)PyCellViewer_removeHistory , METH_VARARGS
, "Remove a Cell from the viewer's history." }
, { "destroy" , (PyCFunction)PyCellViewer_destroy , METH_NOARGS
, "Destroy the associated hurricane object. The python object remains." }
, {NULL, NULL, 0, NULL} /* sentinel */