coriolis/hurricane/src/analog/PyDevice.cpp

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.