212 lines
7.8 KiB
C++
212 lines
7.8 KiB
C++
// -*- C++ -*-
|
|
//
|
|
// This file is part of the Coriolis Software.
|
|
// Copyright (c) UPMC 2010-2018, All Rights Reserved
|
|
//
|
|
// +-----------------------------------------------------------------+
|
|
// | C O R I O L I S |
|
|
// | H u r r i c a n e A n a l o g |
|
|
// | |
|
|
// | Author : Damien Dupuis |
|
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
|
// | =============================================================== |
|
|
// | C++ Module : "./PyDevice.cpp" |
|
|
// +-----------------------------------------------------------------+
|
|
|
|
|
|
#include "hurricane/isobar/PyHurricane.h"
|
|
#include "hurricane/isobar/PyLayer.h"
|
|
#include "hurricane/isobar/PyBox.h"
|
|
#include "hurricane/isobar/PyNet.h"
|
|
#include "hurricane/isobar/PyVertical.h"
|
|
#include "hurricane/isobar/PyHorizontal.h"
|
|
#include "hurricane/isobar/PyPad.h"
|
|
#include "hurricane/isobar/PyContact.h"
|
|
#include "hurricane/isobar/PyPoint.h"
|
|
#include "hurricane/isobar/PyReference.h"
|
|
#include "hurricane/analog/PyDevice.h"
|
|
#include "hurricane/analog/PyParameter.h"
|
|
|
|
|
|
namespace Isobar {
|
|
|
|
using namespace Hurricane;
|
|
using namespace Analog;
|
|
|
|
extern "C" {
|
|
|
|
|
|
#undef ACCESS_OBJECT
|
|
#undef ACCESS_CLASS
|
|
#define ACCESS_OBJECT _baseObject._baseObject._object
|
|
#define ACCESS_CLASS(_pyObject) &(_pyObject->_baseObject._baseObject)
|
|
#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Device,device,function)
|
|
|
|
|
|
// +=================================================================+
|
|
// | "PyDevice" Python Module Code Part |
|
|
// +=================================================================+
|
|
|
|
#if defined(__PYTHON_MODULE__)
|
|
|
|
|
|
// +-------------------------------------------------------------+
|
|
// | "PyDevice" Attribute Methods |
|
|
// +-------------------------------------------------------------+
|
|
|
|
|
|
static PyObject* PyDevice_getParameter ( PyDevice* self, PyObject* args )
|
|
{
|
|
cdebug.log(49) << "PyDevice_getParameter()" << endl;
|
|
|
|
Parameter* parameter = NULL;
|
|
|
|
HTRY
|
|
METHOD_HEAD ( "Device.getParameter()" )
|
|
|
|
char* id = NULL;
|
|
|
|
if (PyArg_ParseTuple( args, "s:Device.getParameter", &id )) {
|
|
parameter = device->getParameter( id );
|
|
} else {
|
|
PyErr_SetString ( ConstructorError, "Bad parameters given to Device.getParameter()." );
|
|
return NULL;
|
|
}
|
|
HCATCH
|
|
|
|
return PyParameter_LinkDerived(parameter);
|
|
}
|
|
|
|
|
|
static PyObject* PyDevice_setRestrictions ( PyDevice* self, PyObject* args )
|
|
{
|
|
cdebug.log(49) << "PyDevice_setRestrictions()" << endl;
|
|
|
|
PyObject* pyNet = NULL;
|
|
unsigned int flags = 0;
|
|
|
|
HTRY
|
|
METHOD_HEAD ( "Device.setRestrictions()" )
|
|
|
|
if (PyArg_ParseTuple( args, "OI:Device.setRestrictions", &pyNet, &flags )) {
|
|
if (not IsPyNet(pyNet)) {
|
|
PyErr_SetString ( ConstructorError, "Device.setRestrictions(): First argument is not of type Net." );
|
|
return NULL;
|
|
}
|
|
device->setRestrictions2( PYNET_O(pyNet), (unsigned int)flags );
|
|
} else {
|
|
PyErr_SetString ( ConstructorError, "Bad parameters number or type given to Device.setRestrictions()." );
|
|
return NULL;
|
|
}
|
|
HCATCH
|
|
|
|
Py_RETURN_NONE;
|
|
}
|
|
|
|
|
|
static PyObject* PyDevice_getRestrictions ( PyDevice* self, PyObject* args )
|
|
{
|
|
cdebug.log(49) << "PyDevice_getRestrictions()" << endl;
|
|
|
|
PyObject* pyNet = NULL;
|
|
unsigned int flags = 0;
|
|
|
|
HTRY
|
|
METHOD_HEAD ( "Device.getRestrictions()" )
|
|
|
|
if (PyArg_ParseTuple( args, "O:Device.getRestrictions", &pyNet )) {
|
|
if (not IsPyNet(pyNet)) {
|
|
PyErr_SetString ( ConstructorError, "Device.getRestrictions(): First argument is not of type Net." );
|
|
return NULL;
|
|
}
|
|
flags = device->getRestrictions2( PYNET_O(pyNet) );
|
|
} else {
|
|
PyErr_SetString ( ConstructorError, "Bad parameters number or type given to Device.setRestrictions()." );
|
|
return NULL;
|
|
}
|
|
HCATCH
|
|
|
|
return Py_BuildValue( "I", flags );
|
|
}
|
|
|
|
|
|
// Standart Accessors (Attributes).
|
|
DirectGetNameAttribute (PyDevice_getDeviceName ,getDeviceName ,PyDevice,Device)
|
|
DirectGetStringAttribute(PyDevice_getLayoutScript ,getLayoutScript ,PyDevice,Device)
|
|
//DirectGetStringAttribute(PyDevice_checkLayoutOnPhysicalGrid,checkLayoutOnPhysicalGrid,PyDevice,Device)
|
|
DirectGetDoubleAttribute(PyDevice_getTemperature ,getTemperature ,PyDevice,Device)
|
|
DirectSetDoubleAttribute(PyDevice_setTemperature ,setTemperature ,PyDevice,Device)
|
|
|
|
DirectVoidMethod(Device,device,destroyLayout)
|
|
|
|
// Standart Destroy (Attribute).
|
|
DBoDestroyAttribute(PyDevice_destroy, PyDevice)
|
|
|
|
|
|
// ---------------------------------------------------------------
|
|
// PyDevice Attribute Method table.
|
|
|
|
PyMethodDef PyDevice_Methods[] =
|
|
{ { "getDeviceName" , (PyCFunction)PyDevice_getDeviceName , METH_NOARGS
|
|
, "Returns the name of the electrical circuit implemented by the device." }
|
|
, { "getLayoutScript" , (PyCFunction)PyDevice_getLayoutScript , METH_NOARGS
|
|
, "Returns the name of the Python script actually used to generate the layout." }
|
|
//, { "checkLayoutOnPhysicalGrid"
|
|
// , (PyCFunction)PyDevice_checkLayoutOnPhysicalGrid, METH_NOARGS
|
|
// , "Return a list of all the components (rectangles) not on foundry grid." }
|
|
, { "destroyLayout" , (PyCFunction)PyDevice_destroyLayout , METH_NOARGS
|
|
, "Remove the layout (the netlist ." }
|
|
, { "getParameter" , (PyCFunction)PyDevice_getParameter , METH_VARARGS
|
|
, "Get a parameter by it's id." }
|
|
, { "getTemperature" , (PyCFunction)PyDevice_getTemperature , METH_NOARGS
|
|
, "Returns the temperature." }
|
|
, { "setTemperature" , (PyCFunction)PyDevice_setTemperature , METH_VARARGS
|
|
, "Sets the temperature." }
|
|
, { "setRestrictions" , (PyCFunction)PyDevice_setRestrictions , METH_VARARGS
|
|
, "Sets the access restrictions for the given net." }
|
|
, { "getRestrictions" , (PyCFunction)PyDevice_getRestrictions , METH_VARARGS
|
|
, "Returns the access restrictions for the given Net." }
|
|
, { "destroy" , (PyCFunction)PyDevice_destroy , METH_NOARGS
|
|
, "Destroys associated hurricane object, the python object remains." }
|
|
, { NULL, NULL, 0, NULL } /* sentinel */
|
|
};
|
|
|
|
|
|
// +-------------------------------------------------------------+
|
|
// | "PyDevice" Object Methods |
|
|
// +-------------------------------------------------------------+
|
|
|
|
|
|
DBoDeleteMethod(Device)
|
|
PyTypeObjectLinkPyType(Device)
|
|
|
|
|
|
#else // End of Python Module Code Part.
|
|
|
|
// +=================================================================+
|
|
// | "PyDevice" Shared Library Code Part |
|
|
// +=================================================================+
|
|
|
|
|
|
DBoLinkCreateMethod(Device)
|
|
PyTypeInheritedObjectDefinitions(Device, Cell)
|
|
|
|
|
|
extern void PyDevice_postModuleInit ()
|
|
{
|
|
PyObject* constant;
|
|
|
|
LoadObjectConstant(PyTypeDevice.tp_dict,Device::NorthBlocked,"NorthBlocked");
|
|
LoadObjectConstant(PyTypeDevice.tp_dict,Device::SouthBlocked,"SouthBlocked");
|
|
LoadObjectConstant(PyTypeDevice.tp_dict,Device::EastBlocked ,"EastBlocked" );
|
|
LoadObjectConstant(PyTypeDevice.tp_dict,Device::WestBlocked ,"WestBlocked" );
|
|
LoadObjectConstant(PyTypeDevice.tp_dict,Device::AllBlocked ,"AllBlocked" );
|
|
}
|
|
|
|
|
|
#endif // End of Shared Library Code Part.
|
|
|
|
} // extern "C".
|
|
|
|
} // Isobar namespace.
|