diff --git a/anabatic/src/AnabaticEngine.cpp b/anabatic/src/AnabaticEngine.cpp index 1f6b8a6c..f835cc86 100644 --- a/anabatic/src/AnabaticEngine.cpp +++ b/anabatic/src/AnabaticEngine.cpp @@ -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)) { diff --git a/anabatic/src/NetBuilder.cpp b/anabatic/src/NetBuilder.cpp index 6dcd5ecd..cb092993 100644 --- a/anabatic/src/NetBuilder.cpp +++ b/anabatic/src/NetBuilder.cpp @@ -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; } diff --git a/anabatic/src/Session.cpp b/anabatic/src/Session.cpp index 9bffc00c..c4dae6ff 100644 --- a/anabatic/src/Session.cpp +++ b/anabatic/src/Session.cpp @@ -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(); diff --git a/anabatic/src/anabatic/Configuration.h b/anabatic/src/anabatic/Configuration.h index a488dea0..802b7080 100644 --- a/anabatic/src/anabatic/Configuration.h +++ b/anabatic/src/anabatic/Configuration.h @@ -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. diff --git a/anabatic/src/anabatic/Session.h b/anabatic/src/anabatic/Session.h index e3e71507..14720a17 100644 --- a/anabatic/src/anabatic/Session.h +++ b/anabatic/src/anabatic/Session.h @@ -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(); } diff --git a/crlcore/src/ccore/RoutingLayerGauge.cpp b/crlcore/src/ccore/RoutingLayerGauge.cpp index aa4f6d12..5515d370 100644 --- a/crlcore/src/ccore/RoutingLayerGauge.cpp +++ b/crlcore/src/ccore/RoutingLayerGauge.cpp @@ -225,7 +225,6 @@ namespace CRL { long index; divide ( position-start, index, modulo ); - cdebug_log(100,0) << "index := " << index << endl; if ( index < 0 ) { diff --git a/crlcore/src/ccore/gds/GdsDriver.cpp b/crlcore/src/ccore/gds/GdsDriver.cpp index 99bc3b19..d4ac19a0 100644 --- a/crlcore/src/ccore/gds/GdsDriver.cpp +++ b/crlcore/src/ccore/gds/GdsDriver.cpp @@ -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(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; diff --git a/crlcore/src/pyCRL/CMakeLists.txt b/crlcore/src/pyCRL/CMakeLists.txt index 00316996..0134ecda 100644 --- a/crlcore/src/pyCRL/CMakeLists.txt +++ b/crlcore/src/pyCRL/CMakeLists.txt @@ -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 + ) diff --git a/crlcore/src/pyCRL/PyConstant.cpp b/crlcore/src/pyCRL/PyConstant.cpp new file mode 100644 index 00000000..38466be0 --- /dev/null +++ b/crlcore/src/pyCRL/PyConstant.cpp @@ -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. diff --git a/crlcore/src/pyCRL/PyRoutingGauge.cpp b/crlcore/src/pyCRL/PyRoutingGauge.cpp index 8cd8a64e..4876cb38 100644 --- a/crlcore/src/pyCRL/PyRoutingGauge.cpp +++ b/crlcore/src/pyCRL/PyRoutingGauge.cpp @@ -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 diff --git a/hurricane/src/viewer/PyCellViewer.cpp b/hurricane/src/viewer/PyCellViewer.cpp index 4fe0e85b..4752a7ae 100644 --- a/hurricane/src/viewer/PyCellViewer.cpp +++ b/hurricane/src/viewer/PyCellViewer.cpp @@ -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 */