diff --git a/bootstrap/build.conf b/bootstrap/build.conf index 41a8e19d..88bf54f1 100644 --- a/bootstrap/build.conf +++ b/bootstrap/build.conf @@ -30,6 +30,7 @@ projects = [ , "equinox" , "solstice" , "unicorn" + , "tutorial" #, "testbench" #, "ispd" , "cumulus" diff --git a/tutorial/CMakeLists.txt b/tutorial/CMakeLists.txt new file mode 100644 index 00000000..1068385d --- /dev/null +++ b/tutorial/CMakeLists.txt @@ -0,0 +1,37 @@ +# -*- explicit-buffer-name: "CMakeLists.txt" -*- + + set(CMAKE_LEGACY_CYGWIN_WIN32 0) + project(TUTORIAL) + + option(BUILD_DOC "Build the documentation (doxygen)" OFF) + + cmake_minimum_required(VERSION 2.8.9) + + list(INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/") + find_package(Bootstrap REQUIRED) + setup_project_paths(CORIOLIS) + + set_cmake_policies() + set_lib_link_mode() + setup_boost(program_options python) + setup_qt() + + find_package(Libexecinfo REQUIRED) + find_package(LibXml2 REQUIRED) + find_package(PythonLibs 2 REQUIRED) + find_package(PythonSitePackages REQUIRED) + find_package(LEFDEF REQUIRED) + find_package(VLSISAPD REQUIRED) + find_package(HURRICANE REQUIRED) + find_package(CORIOLIS REQUIRED) + + add_subdirectory(src) + add_subdirectory(python) +#add_subdirectory(cmake_modules) + +#if(BUILD_DOC) +# find_package(Doxygen) +# if(DOXYGEN_FOUND) +# add_subdirectory(doc) +# endif() +#endif() diff --git a/tutorial/python/CMakeLists.txt b/tutorial/python/CMakeLists.txt new file mode 100644 index 00000000..66ed43f6 --- /dev/null +++ b/tutorial/python/CMakeLists.txt @@ -0,0 +1,3 @@ +# -*- explicit-buffer-name: "CMakeLists.txt" -*- + + install ( FILES runDemo.py DESTINATION ${PYTHON_SITE_PACKAGES}/cumulus/plugins ) diff --git a/tutorial/python/runDemo.py b/tutorial/python/runDemo.py new file mode 100644 index 00000000..833c4526 --- /dev/null +++ b/tutorial/python/runDemo.py @@ -0,0 +1,168 @@ +#!/usr/bin/env python +# +# This file is part of the Coriolis Software. +# Copyright (c) UPMC 2017-2017, All Rights Reserved +# +# +-----------------------------------------------------------------+ +# | C O R I O L I S | +# | T o o l E n g i n e T u t o r i a l | +# | | +# | Author : Jean-Paul CHAPUT | +# | E-mail : Jean-Paul.Chaput@lip6.fr | +# | =============================================================== | +# | Python : "./plugins/RSavePlugin.py" | +# +-----------------------------------------------------------------+ + + +try: + import sys + import os.path + import Cfg + import Viewer + import CRL + import helpers + from helpers import ErrorMessage + from helpers import WarningMessage + from helpers import showPythonTrace + import plugins + from Hurricane import DataBase + from Hurricane import Breakpoint + from Hurricane import UpdateSession + from Hurricane import DbU + from Hurricane import Box + from Hurricane import Contact + from Hurricane import Vertical + from Hurricane import Horizontal + from Hurricane import Net + from Hurricane import Cell +except ImportError, e: + serror = str(e) + if serror.startswith('No module named'): + module = serror.split()[-1] + print '[ERROR] The <%s> python module or symbol cannot be loaded.' % module + print ' Please check the integrity of the package.' + if serror.find('cannot open shared object file'): + library = serror.split(':')[0] + print '[ERROR] The <%s> shared library cannot be loaded.' % library + print ' Under RHEL 6, you must be under devtoolset-2.' + print ' (scl enable devtoolset-2 bash)' + sys.exit(1) +except Exception, e: + print '[ERROR] A strange exception occurred while loading the basic Coriolis/Python' + print ' modules. Something may be wrong at Python/C API level.\n' + print ' %s' % e + sys.exit(2) + + + +def runDemo ( cell, editor ): + print 'runDemo() Python plugin function has been called.' + + if cell: + print WarningMessage( 'A Cell "%s" is already loaded in the Viewer, cowardly exiting.' % cell.getName() ) + return + + library = CRL.AllianceFramework.get().getLibrary( 0 ) + cell = CRL.AllianceFramework.get().getCell( 'demo_cell', CRL.Catalog.State.Views ) + if cell: + print WarningMessage( '"demo_cell" has already been created, do not run twice.' ) + return + + UpdateSession.open() + cell = Cell.create( library, 'demo_cell' ) + + cell.setAbutmentBox( Box( DbU.fromLambda( 0.0), DbU.fromLambda( 0.0) + , DbU.fromLambda(15.0), DbU.fromLambda(50.0) ) ) + UpdateSession.close() + + if editor: editor.setCell( cell ) + + Breakpoint.stop( 5, 'Abutment box has been drawn.' ) + UpdateSession.open() + + technology = DataBase.getDB().getTechnology() + nwell = technology.getLayer( 'NWELL' ) + ntrans = technology.getLayer( 'NTRANS' ) + ptrans = technology.getLayer( 'PTRANS' ) + diffN = technology.getLayer( 'NDIF' ) + diffP = technology.getLayer( 'PDIF' ) + contDiffN = technology.getLayer( 'CONT_DIF_N' ) + contDiffP = technology.getLayer( 'CONT_DIF_P' ) + contPoly = technology.getLayer( 'CONT_POLY' ) + poly = technology.getLayer( 'POLY' ) + metal1 = technology.getLayer( 'METAL1' ) + + nwellNet = Net.create( cell, 'nwell' ) + Horizontal.create( nwellNet, nwell, DbU.fromLambda(39.0), DbU.fromLambda(24.0), DbU.fromLambda(0.0), DbU.fromLambda(15.0) ) + + vss = Net.create( cell, 'vss' ) + vdd = Net.create( cell, 'vdd' ) + + Horizontal.create( vss, metal1 , DbU.fromLambda(3.0), DbU.fromLambda(6.0), DbU.fromLambda(0.0), DbU.fromLambda(15.0) ) + Vertical.create ( vss, diffN , DbU.fromLambda(3.5), DbU.fromLambda(4.0), DbU.fromLambda(4.0), DbU.fromLambda(12.0) ) + Contact.create ( vss, contDiffN, DbU.fromLambda(4.0), DbU.fromLambda(5.0) ) + + Horizontal.create( vdd, metal1 , DbU.fromLambda(47.0), DbU.fromLambda( 6.0), DbU.fromLambda( 0.0), DbU.fromLambda(15.0) ) + Vertical.create ( vdd, diffP , DbU.fromLambda( 3.5), DbU.fromLambda( 4.0), DbU.fromLambda(28.0), DbU.fromLambda(46.0) ) + Contact.create ( vdd, contDiffP, DbU.fromLambda( 4.0), DbU.fromLambda(45.0) ) + + UpdateSession.close() + Breakpoint.stop( 5, 'Power nets have been drawn.' ) + UpdateSession.open() + + nq = Net.create( cell, 'nq' ) + Vertical.create ( nq, diffN , DbU.fromLambda(10.0), DbU.fromLambda( 3.0), DbU.fromLambda( 8.0), DbU.fromLambda(12.0) ) + Vertical.create ( nq, diffP , DbU.fromLambda(10.0), DbU.fromLambda( 3.0), DbU.fromLambda(28.0), DbU.fromLambda(37.0) ) + Contact.create ( nq, contDiffN, DbU.fromLambda(10.0), DbU.fromLambda(10.0) ) + Contact.create ( nq, contDiffP, DbU.fromLambda(10.0), DbU.fromLambda(30.0) ) + Contact.create ( nq, contDiffP, DbU.fromLambda(10.0), DbU.fromLambda(35.0) ) + Vertical.create ( nq, metal1 , DbU.fromLambda(10.0), DbU.fromLambda( 2.0), DbU.fromLambda(10.0), DbU.fromLambda(40.0) ) + + UpdateSession.close() + Breakpoint.stop( 5, 'Output has been drawn.' ) + UpdateSession.open() + + i = Net.create( cell, 'i' ) + Vertical.create ( i, ntrans , DbU.fromLambda( 7.0), DbU.fromLambda( 1.0), DbU.fromLambda( 6.0), DbU.fromLambda(14.0) ) + Vertical.create ( i, poly , DbU.fromLambda( 7.0), DbU.fromLambda( 1.0), DbU.fromLambda(14.0), DbU.fromLambda(26.0) ) + Vertical.create ( i, ptrans , DbU.fromLambda( 7.0), DbU.fromLambda( 1.0), DbU.fromLambda(26.0), DbU.fromLambda(39.0) ) + Horizontal.create( i, poly , DbU.fromLambda(20.0), DbU.fromLambda( 3.0), DbU.fromLambda( 4.0), DbU.fromLambda( 7.0) ) + Contact.create ( i, contPoly , DbU.fromLambda( 5.0), DbU.fromLambda(20.0) ) + Vertical.create ( i, metal1 , DbU.fromLambda( 5.0), DbU.fromLambda( 2.0), DbU.fromLambda(10.0), DbU.fromLambda(40.0) ) + + UpdateSession.close() + Breakpoint.stop( 5, 'Input has been drawn.' ) + return + + +# -------------------------------------------------------------------- +# Plugin hook functions, unicornHook:menus, ScritMain:call + +def unicornHook ( **kw ): + editor = kw['editor'] + editor.addMenu( 'tutorials' , 'Tutorials', Viewer.CellViewer.TopMenu ) + editor.addMenu( 'tutorials.plugins', 'Plugins' , Viewer.CellViewer.NoFlags ) + plugins.kwUnicornHook( 'tutorials.plugins.runDemo' + , 'Tutorial - Run Demo (Python flavor)' + , 'Launch runDemo() in the Tutorial Python plugin.' + , sys.modules[__name__].__file__ + , **kw + ) + return + + +def ScriptMain ( **kw ): + try: + helpers.staticInitialization( quiet=True ) + #helpers.setTraceLevel( 550 ) + + cell, editor = plugins.kwParseMain( **kw ) + + runDemo( cell, editor ) + + except ErrorMessage, e: + print e; errorCode = e.code + except Exception, e: + showPythonTrace( 'runDemo.py', e ) + + return 0 diff --git a/tutorial/src/CMakeLists.txt b/tutorial/src/CMakeLists.txt new file mode 100644 index 00000000..e93d9f9d --- /dev/null +++ b/tutorial/src/CMakeLists.txt @@ -0,0 +1,64 @@ +# -*- explicit-buffer-name: "CMakeLists.txt" -*- + +# include( ${QT_USE_FILE} ) + include_directories( ${TUTORIAL_SOURCE_DIR}/src + ${CORIOLIS_INCLUDE_DIR} + ${HURRICANE_INCLUDE_DIR} + ${CONFIGURATION_INCLUDE_DIR} + ${QtX_INCLUDE_DIR} + ${Boost_INCLUDE_DIRS} + ${PYTHON_INCLUDE_PATH} + ) + set( includes tutorial/TutorialEngine.h + tutorial/GraphicTutorialEngine.h + ) + set( pyIncludes tutorial/PyTutorialEngine.h + tutorial/PyGraphicTutorialEngine.h + ) + set( mocIncludes tutorial/GraphicTutorialEngine.h ) + set( cpps TutorialEngine.cpp + GraphicTutorialEngine.cpp + ) + set( pyCpps PyTutorial.cpp + PyTutorialEngine.cpp + PyGraphicTutorialEngine.cpp + ) + qtX_wrap_cpp( mocCpps ${mocIncludes} ) + + set( depLibs ${CORIOLIS_PYTHON_LIBRARIES} + ${CORIOLIS_LIBRARIES} + ${HURRICANE_PYTHON_LIBRARIES} + ${HURRICANE_GRAPHICAL_LIBRARIES} + ${HURRICANE_LIBRARIES} + ${CONFIGURATION_LIBRARY} + ${BOOKSHELF_LIBRARY} + ${CIF_LIBRARY} + ${AGDS_LIBRARY} + ${UTILITIES_LIBRARY} + ${LEFDEF_LIBRARIES} + ${OA_LIBRARIES} + ${QtX_LIBRARIES} + ${Boost_LIBRARIES} + ${LIBXML2_LIBRARIES} + ${PYTHON_LIBRARIES} -lutil + ${LIBEXECINFO_LIBRARIES} + ) + + add_library( tutorial ${cpps} ${mocCpps} ${pyCpps} ) + set_target_properties( tutorial PROPERTIES VERSION 1.0 SOVERSION 1 ) + target_link_libraries( tutorial ${depLibs} ) + + add_python_module( "${pyCpps}" + "${pyIncludes}" + "Do_not_generate_C_library" + Tutorial + "tutorial;${depLibs}" + include/coriolis2/tutorial + ) + + install( TARGETS tutorial DESTINATION lib${LIB_SUFFIX} ) + install( PROGRAMS tutorial.py DESTINATION bin RENAME tutorial ) + install( FILES ${includes} + ${mocIncludes} DESTINATION include/coriolis2/tutorial ) + + diff --git a/tutorial/src/GraphicTutorialEngine.cpp b/tutorial/src/GraphicTutorialEngine.cpp new file mode 100644 index 00000000..92d15594 --- /dev/null +++ b/tutorial/src/GraphicTutorialEngine.cpp @@ -0,0 +1,184 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2017, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | T o o l E n g i n e T u t o r i a l | +// | | +// | Author : Jean-Paul Chaput | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./GraphicTutorialEngine.cpp" | +// +-----------------------------------------------------------------+ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace Tutorial { + + using namespace std; + using Hurricane::Error; + using Hurricane::Warning; + using Hurricane::Exception; + using Hurricane::Breakpoint; + using Hurricane::DebugSession; + using Hurricane::Point; + using Hurricane::Entity; + using Hurricane::Net; + using Hurricane::Graphics; + using Hurricane::ControllerWidget; + using Hurricane::ExceptionWidget; + using CRL::Catalog; + using CRL::AllianceFramework; + + + size_t GraphicTutorialEngine::_references = 0; + GraphicTutorialEngine* GraphicTutorialEngine::_singleton = NULL; + + + TutorialEngine* GraphicTutorialEngine::createEngine () + { + Cell* cell = getCell (); + + TutorialEngine* tutorial = TutorialEngine::get( cell ); + if (not tutorial) { + tutorial = TutorialEngine::create( cell ); + tutorial->setViewer( _viewer ); + } else + cerr << Warning( "%s already has a Tutorial engine.", getString(cell).c_str() ) << endl; + + return tutorial; + } + + + TutorialEngine* GraphicTutorialEngine::getForFramework () + { + // Currently, only one framework is avalaible: Alliance. + + TutorialEngine* tutorial = TutorialEngine::get( getCell() ); + if (tutorial) return tutorial; + + tutorial = createEngine(); + if (not tutorial) + throw Error( "Failed to create Tutorial engine on %s.", getString(getCell()).c_str() ); + + return tutorial; + } + + + void GraphicTutorialEngine::_runDemoPart1 () + { + TutorialEngine* tutorial = getForFramework(); + Cell* demo = tutorial->runDemoPart1(); + + _viewer->setCell( demo ); + } + + + void GraphicTutorialEngine::_runDemoPart2 () + { + TutorialEngine* tutorial = getForFramework(); + tutorial->runDemoPart2(); + } + + + void GraphicTutorialEngine::addToMenu ( CellViewer* viewer ) + { + assert( _viewer == NULL ); + + _viewer = viewer; + + if (_viewer->hasMenuAction("tutorials.runDemoPart1")) { + cerr << Warning( "GraphicTutorialEngine::addToMenu() - Tutorial tool already hooked in." ) << endl; + return; + } + + _viewer->addMenu ( "tutorials", "Tutorials", CellViewer::TopMenu ); + _viewer->addToMenu( "tutorials.runDemoPart1" + , "Tutorial - &Run Demo, part 1" + , "Launch the Tutorial::runDemo() method." + , std::bind(&GraphicTutorialEngine::_runDemoPart1,this) + ); + _viewer->addToMenu( "tutorials.runDemoPart2" + , "Tutorial - &Run Demo, part 2" + , "Launch the Tutorial::runDemo() method." + , std::bind(&GraphicTutorialEngine::_runDemoPart2,this) + ); + } + + + const Name& GraphicTutorialEngine::getName () const + { return TutorialEngine::staticGetName(); } + + + Cell* GraphicTutorialEngine::getCell () + { + if (_viewer == NULL) { + throw Error( "Tutorial: GraphicTutorialEngine not bound to any Viewer." ); + return NULL; + } + + if (_viewer->getCell() == NULL) { + throw Error( "Tutorial: No Cell is loaded into the Viewer." ); + return NULL; + } + + return _viewer->getCell(); + } + + + GraphicTutorialEngine* GraphicTutorialEngine::grab () + { + if (not _references) { + _singleton = new GraphicTutorialEngine (); + } + _references++; + + return _singleton; + } + + + size_t GraphicTutorialEngine::release () + { + --_references; + if (not _references) { + delete _singleton; + _singleton = NULL; + } + return _references; + } + + + GraphicTutorialEngine::GraphicTutorialEngine () + : GraphicTool() + , _viewer (NULL) + { } + + + GraphicTutorialEngine::~GraphicTutorialEngine () + { } + + +} // Tutorial namespace. diff --git a/tutorial/src/PyGraphicTutorialEngine.cpp b/tutorial/src/PyGraphicTutorialEngine.cpp new file mode 100644 index 00000000..d39ed5c7 --- /dev/null +++ b/tutorial/src/PyGraphicTutorialEngine.cpp @@ -0,0 +1,116 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2017, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | T o o l E n g i n e T u t o r i a l | +// | | +// | Author : Jean-Paul Chaput | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./PyGraphicTutorialEngine.cpp" | +// +-----------------------------------------------------------------+ + + +#include "tutorial/PyGraphicTutorialEngine.h" +#include "hurricane/isobar/PyCell.h" +#include "hurricane/Cell.h" + + +#undef ACCESS_OBJECT +#undef ACCESS_CLASS +#define ACCESS_OBJECT _baseObject._object +#define ACCESS_CLASS(_pyObject) &(_pyObject->_baseObject) +#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(GraphicTutorialEngine,gtool,function) + + +namespace Tutorial { + +using namespace Hurricane; +using namespace Isobar; + +extern "C" { + + +// +=================================================================+ +// | "PyGraphicTutorialEngine" Python Module Code Part | +// +=================================================================+ + +#if defined(__PYTHON_MODULE__) + + static PyObject* PyGraphicTutorialEngine_grab ( PyObject* ) + { + cdebug_log(40,0) << "PyGraphicTutorialEngine_grab()" << endl; + PyGraphicTutorialEngine* pyGraphicTutorialEngine = NULL; + + HTRY + pyGraphicTutorialEngine = PyObject_NEW ( PyGraphicTutorialEngine, &PyTypeGraphicTutorialEngine ); + if ( pyGraphicTutorialEngine == NULL ) return NULL; + + pyGraphicTutorialEngine->ACCESS_OBJECT = GraphicTutorialEngine::grab(); + HCATCH + + return (PyObject*)pyGraphicTutorialEngine; + } + + + static PyObject* PyGraphicTutorialEngine_getCell ( PyGraphicTutorialEngine* self ) + { + cdebug_log(40,0) << "PyGraphicTutorialEngine_getCell ()" << endl; + + Cell* cell = NULL; + + HTRY + METHOD_HEAD("GraphicTutorialEngine.getCell()") + cell = gtool->getCell (); + HCATCH + + if (cell == NULL) Py_RETURN_NONE; + return PyCell_Link(cell); + } + + + GetNameMethod(GraphicTutorialEngine, gtool) + + // Standart destroy (Attribute). + + + PyMethodDef PyGraphicTutorialEngine_Methods[] = + { { "grab" , (PyCFunction)PyGraphicTutorialEngine_grab , METH_NOARGS|METH_STATIC + , "Returns the GraphicTutorialEngine singleton." } + , { "getName" , (PyCFunction)PyGraphicTutorialEngine_getName , METH_NOARGS + , "Returns the name of the GraphicTutorialEngine (class attribute)." } + , { "getCell" , (PyCFunction)PyGraphicTutorialEngine_getCell , METH_NOARGS + , "Returns the Cell on which this GraphicTutorialEngine is attached." } + , {NULL, NULL, 0, NULL} /* sentinel */ + }; + + + // --------------------------------------------------------------- + // PyGraphicTutorialEngine Type Methods. + + + PythonOnlyDeleteMethod(GraphicTutorialEngine) + PyTypeObjectLinkPyType(GraphicTutorialEngine) + + +#else // End of Python Module Code Part. + + +// +=================================================================+ +// | "PyGraphicTutorialEngine" Shared Library Code Part | +// +=================================================================+ + + // Link/Creation Method. + LinkCreateMethod(GraphicTutorialEngine) + + PyTypeInheritedObjectDefinitions(GraphicTutorialEngine,GraphicTool) + + +#endif // End of Shared Library Code Part. + +} // extern "C". + +} // Tutorial namespace. diff --git a/tutorial/src/PyTutorial.cpp b/tutorial/src/PyTutorial.cpp new file mode 100644 index 00000000..7bdd25c2 --- /dev/null +++ b/tutorial/src/PyTutorial.cpp @@ -0,0 +1,91 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2017, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | T o o l E n g i n e T u t o r i a l | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./PyTutorial.cpp" | +// +-----------------------------------------------------------------+ + + +#include "hurricane/isobar/PyHurricane.h" +#include "hurricane/isobar/PyCell.h" +#include "tutorial/PyTutorialEngine.h" +#include "tutorial/PyGraphicTutorialEngine.h" + + +namespace Tutorial { + + using std::cerr; + using std::endl; + using Hurricane::tab; + using Isobar::__cs; + using CRL::PyTypeToolEngine; + using CRL::PyTypeGraphicTool; + + +#if !defined(__PYTHON_MODULE__) + +// +=================================================================+ +// | "PyTutorial" Shared Library Code Part | +// +=================================================================+ + + +# else // End of PyHurricane Shared Library Code Part. + + +// +=================================================================+ +// | "PyTutorial" Python Module Code Part | +// +=================================================================+ + + +extern "C" { + + // +-------------------------------------------------------------+ + // | "PyTutorial" Module Methods | + // +-------------------------------------------------------------+ + + + static PyMethodDef PyTutorial_Methods[] = + { {NULL, NULL, 0, NULL} /* sentinel */ + }; + + + // --------------------------------------------------------------- + // Module Initialization : "initTutorial ()" + + DL_EXPORT(void) initTutorial () { + cdebug_log(40,0) << "initTutorial()" << endl; + + PyTutorialEngine_LinkPyType(); + PyGraphicTutorialEngine_LinkPyType(); + + PYTYPE_READY_SUB( TutorialEngine , ToolEngine ); + PYTYPE_READY_SUB( GraphicTutorialEngine, GraphicTool ); + + PyObject* module = Py_InitModule( "Tutorial", PyTutorial_Methods ); + if (module == NULL) { + cerr << "[ERROR]\n" + << " Failed to initialize Tutorial module." << endl; + return; + } + + Py_INCREF( &PyTypeTutorialEngine ); + PyModule_AddObject( module, "TutorialEngine", (PyObject*)&PyTypeTutorialEngine ); + Py_INCREF( &PyTypeGraphicTutorialEngine ); + PyModule_AddObject( module, "GraphicTutorialEngine", (PyObject*)&PyTypeGraphicTutorialEngine ); + } + + +} // End of extern "C". + +#endif // Python Module Code Part. + +} // Tutorial namespace. diff --git a/tutorial/src/PyTutorialEngine.cpp b/tutorial/src/PyTutorialEngine.cpp new file mode 100644 index 00000000..b9c30711 --- /dev/null +++ b/tutorial/src/PyTutorialEngine.cpp @@ -0,0 +1,218 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2017, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | T o o l E n g i n e T u t o r i a l | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./PyTutorialEngine.cpp" | +// +-----------------------------------------------------------------+ + + +#include "hurricane/isobar/PyCell.h" +#include "hurricane/viewer/PyCellViewer.h" +#include "hurricane/viewer/ExceptionWidget.h" +#include "hurricane/Cell.h" +#include "crlcore/Utilities.h" +#include "tutorial/PyTutorialEngine.h" +#include + +# undef ACCESS_OBJECT +# undef ACCESS_CLASS +# define ACCESS_OBJECT _baseObject._object +# define ACCESS_CLASS(_pyObject) &(_pyObject->_baseObject) +#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(TutorialEngine,tutorial,function) + + +namespace Tutorial { + + using std::cerr; + using std::endl; + using std::hex; + using std::ostringstream; + using Hurricane::tab; + using Hurricane::Exception; + using Hurricane::Bug; + using Hurricane::Error; + using Hurricane::Warning; + using Hurricane::ExceptionWidget; + using Isobar::ProxyProperty; + using Isobar::ProxyError; + using Isobar::ConstructorError; + using Isobar::HurricaneError; + using Isobar::HurricaneWarning; + using Isobar::ParseOneArg; + using Isobar::ParseTwoArg; + using Isobar::PyCell; + using Isobar::PyCell_Link; + using Isobar::PyCellViewer; + using Isobar::PyTypeCellViewer; + using CRL::PyToolEngine; + + +extern "C" { + +#if defined(__PYTHON_MODULE__) + + +// +=================================================================+ +// | "PyTutorialEngine" Python Module Code Part | +// +=================================================================+ + + + static PyObject* PyTutorialEngine_get ( PyObject*, PyObject* args ) + { + cdebug_log(40,0) << "PyTutorialEngine_get()" << endl; + + TutorialEngine* tutorial = NULL; + + HTRY + PyObject* arg0; + + if (not ParseOneArg("Tutorial.get", args, CELL_ARG, &arg0)) return NULL; + tutorial = TutorialEngine::get(PYCELL_O(arg0)); + HCATCH + + return PyTutorialEngine_Link(tutorial); + } + + + static PyObject* PyTutorialEngine_create ( PyObject*, PyObject* args ) + { + cdebug_log(40,0) << "PyTutorialEngine_create()" << endl; + + TutorialEngine* tutorial = NULL; + + HTRY + PyObject* arg0; + + if (not ParseOneArg("Tutorial.get", args, CELL_ARG, &arg0)) return NULL; + + Cell* cell = PYCELL_O(arg0); + tutorial = TutorialEngine::get(cell); + + if (tutorial == NULL) { + tutorial = TutorialEngine::create(cell); + } else + cerr << Warning("%s already has a Tutorial engine.",getString(cell).c_str()) << endl; + HCATCH + + return PyTutorialEngine_Link(tutorial); + } + + + static PyObject* PyTutorialEngine_setViewer ( PyTutorialEngine* self, PyObject* args ) + { + cdebug_log(40,0) << "PyTutorialEngine_setViewer ()" << endl; + + HTRY + METHOD_HEAD( "TutorialEngine.setViewer()" ) + + PyObject* pyViewer = NULL; + if (not PyArg_ParseTuple(args,"O:EtesianEngine.setViewer()",&pyViewer)) { + PyErr_SetString( ConstructorError, "Bad parameters given to EtesianEngine.setViewer()." ); + return NULL; + } + if (IsPyCellViewer(pyViewer)) { + tutorial->setViewer( PYCELLVIEWER_O(pyViewer) ); + } + HCATCH + + Py_RETURN_NONE; + } + + + PyObject* PyTutorialEngine_runDemoPart1 ( PyTutorialEngine* self ) + { + cdebug_log(40,0) << "PyTutorialEngine_runDemoPart1()" << endl; + + Cell* cell = NULL; + + HTRY + METHOD_HEAD("TutorialEngine.runDemoPart1()") + if (tutorial->getViewer()) { + if (ExceptionWidget::catchAllWrapper( std::bind(&TutorialEngine::runDemoPart1,tutorial) )) { + PyErr_SetString( HurricaneError, "TutorialEngine::runDemoPart1() has thrown an exception (C++)." ); + return NULL; + } + cell = tutorial->getCell(); + } else { + cell = tutorial->runDemoPart1(); + } + HCATCH + + return PyCell_Link( cell ); + } + + + PyObject* PyTutorialEngine_runDemoPart2 ( PyTutorialEngine* self ) + { + cdebug_log(40,0) << "PyTutorialEngine_runDemoPart2()" << endl; + + HTRY + METHOD_HEAD("TutorialEngine.runDemoPart2()") + if (tutorial->getViewer()) { + if (ExceptionWidget::catchAllWrapper( std::bind(&TutorialEngine::runDemoPart1,tutorial) )) { + PyErr_SetString( HurricaneError, "TutorialEngine::runDemoPart2() has thrown an exception (C++)." ); + return NULL; + } + } else { + tutorial->runDemoPart2(); + } + HCATCH + + Py_RETURN_NONE; + } + + + // Standart Accessors (Attributes). + + // Standart Destroy (Attribute). + DBoDestroyAttribute(PyTutorialEngine_destroy,PyTutorialEngine) + + + PyMethodDef PyTutorialEngine_Methods[] = + { { "get" , (PyCFunction)PyTutorialEngine_get , METH_VARARGS|METH_STATIC + , "Returns the Tutorial engine attached to the Cell, None if there isnt't." } + , { "create" , (PyCFunction)PyTutorialEngine_create , METH_VARARGS|METH_STATIC + , "Create a Tutorial engine on this cell." } + , { "setViewer" , (PyCFunction)PyTutorialEngine_setViewer , METH_VARARGS + , "Associate a Viewer to this TutorialEngine." } + , { "runDemoPart1" , (PyCFunction)PyTutorialEngine_runDemoPart1 , METH_NOARGS + , "Run the first part of the demo." } + , { "runDemoPart2" , (PyCFunction)PyTutorialEngine_runDemoPart2 , METH_NOARGS + , "Run the second part of the demo." } + , { "destroy" , (PyCFunction)PyTutorialEngine_destroy , METH_NOARGS + , "Destroy the associated hurricane object. The python object remains." } + , {NULL, NULL, 0, NULL} /* sentinel */ + }; + + + DBoDeleteMethod(TutorialEngine) + PyTypeObjectLinkPyType(TutorialEngine) + + +#else // End of Python Module Code Part. + + +// +=================================================================+ +// | "PyTutorialEngine" Shared Library Code Part | +// +=================================================================+ + + + // Link/Creation Method. + PyTypeInheritedObjectDefinitions(TutorialEngine,PyToolEngine) + DBoLinkCreateMethod(TutorialEngine) + + +#endif // Shared Library Code Part. + +} // extern "C". + +} // Tutorial namespace. + diff --git a/tutorial/src/TutorialEngine.cpp b/tutorial/src/TutorialEngine.cpp new file mode 100644 index 00000000..6e118995 --- /dev/null +++ b/tutorial/src/TutorialEngine.cpp @@ -0,0 +1,274 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2017, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | T o o l E n g i n e T u t o r i a l | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./TutorialEngine.cpp" | +// +-----------------------------------------------------------------+ + + +#include +#include +#include +#include +#include "vlsisapd/utilities/Path.h" +#include "hurricane/DebugSession.h" +#include "hurricane/UpdateSession.h" +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/Warning.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/Breakpoint.h" +#include "hurricane/Layer.h" +#include "hurricane/Net.h" +#include "hurricane/RoutingPad.h" +#include "hurricane/Plug.h" +#include "hurricane/Cell.h" +#include "hurricane/Instance.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" +#include "crlcore/AllianceFramework.h" +#include "tutorial/TutorialEngine.h" + + +namespace Tutorial { + + using namespace std; + using Hurricane::dbo_ptr; + using Hurricane::UpdateSession; + using Hurricane::DebugSession; + using Hurricane::tab; + using Hurricane::Bug; + using Hurricane::Error; + using Hurricane::Warning; + using Hurricane::Breakpoint; + using Hurricane::Timer; + using Hurricane::DbU; + using Hurricane::Box; + using Hurricane::Layer; + using Hurricane::DataBase; + using Hurricane::Technology; + using Hurricane::Component; + using Hurricane::Contact; + using Hurricane::Horizontal; + using Hurricane::Vertical; + using Hurricane::RoutingPad; + using Hurricane::Cell; + using Hurricane::Plug; + using Hurricane::Instance; + using Hurricane::Transformation; + using Hurricane::Occurrence; + + +// ------------------------------------------------------------------- +// Class : "Tutorial::TutorialEngine". + + Name TutorialEngine::_toolName = "Tutorial"; + + + const Name& TutorialEngine::staticGetName () + { return _toolName; } + + + TutorialEngine* TutorialEngine::get ( const Cell* cell ) + { return static_cast(ToolEngine::get(cell,staticGetName())); } + + + TutorialEngine::TutorialEngine ( Cell* cell ) + : Super (cell) + , _viewer (NULL) + { } + + + void TutorialEngine::_postCreate () + { + Super::_postCreate (); + } + + + TutorialEngine* TutorialEngine::create ( Cell* cell ) + { + TutorialEngine* tutorial = new TutorialEngine ( cell ); + + tutorial->_postCreate(); + + return tutorial; + } + + + void TutorialEngine::_preDestroy () + { } + + + TutorialEngine::~TutorialEngine () + { } + + + const Name& TutorialEngine::getName () const + { return _toolName; } + + + Cell* TutorialEngine::runDemoPart1 () + { + cerr << "TutorialEngine::runDemoPart1() has been called." << endl; + + CRL::AllianceFramework* framework = CRL::AllianceFramework::get(); + + UpdateSession::open(); + + Cell* demo = framework->createCell( "demo_cell_2" ); + demo->setAbutmentBox( Box( DbU::fromLambda( 0.0) + , DbU::fromLambda( 0.0) + , DbU::fromLambda(135.0) + , DbU::fromLambda(110.0) + ) ); + + // Instanciation & placement of "i1_xr2". + Cell* model = framework->getCell( "xr2_x1", CRL::Catalog::State::Views ); + Instance* i1_xr2 = Instance::create( demo, "i1_xr2", model ); + i1_xr2->setTransformation( Transformation( DbU::fromLambda( 0.0 ) + , DbU::fromLambda( 0.0 ) + , Transformation::Orientation::ID + ) ); + i1_xr2->setPlacementStatus( Instance::PlacementStatus::PLACED ); + + // Instanciation & placement of "i2_xr2". + model = framework->getCell( "xr2_x1", CRL::Catalog::State::Views ); + Instance* i2_xr2 = Instance::create( demo, "i2_xr2", model ); + i2_xr2->setTransformation( Transformation( DbU::fromLambda( 55.0 ) + , DbU::fromLambda( 0.0 ) + , Transformation::Orientation::ID + ) ); + i2_xr2->setPlacementStatus( Instance::PlacementStatus::PLACED ); + + // Instanciation & placement of "i3_a2". + model = framework->getCell( "a2_x2", CRL::Catalog::State::Views ); + Instance* i3_a2 = Instance::create( demo, "i3_a2", model ); + i3_a2->setTransformation( Transformation( DbU::fromLambda( 0.0 ) + , DbU::fromLambda( 100.0 ) + , Transformation::Orientation::MY + ) ); + i3_a2->setPlacementStatus( Instance::PlacementStatus::PLACED ); + + // Instanciation & placement of "i4_a2". + model = framework->getCell( "a2_x2", CRL::Catalog::State::Views ); + Instance* i4_a2 = Instance::create( demo, "i4_a2", model ); + i4_a2->setTransformation( Transformation( DbU::fromLambda( 55.0 ) + , DbU::fromLambda( 100.0 ) + , Transformation::Orientation::MY + ) ); + i4_a2->setPlacementStatus( Instance::PlacementStatus::PLACED ); + + // Instanciation & placement of "i1_xr2". + model = framework->getCell( "o2_x2", CRL::Catalog::State::Views ); + Instance* i5_o2 = Instance::create( demo, "i5_o2", model ); + i5_o2->setTransformation( Transformation( DbU::fromLambda( 110.0 ) + , DbU::fromLambda( 0.0 ) + , Transformation::Orientation::ID + ) ); + i5_o2->setPlacementStatus( Instance::PlacementStatus::PLACED ); + + UpdateSession::close(); + + return demo; + } + + + void TutorialEngine::runDemoPart2 () + { + cerr << "TutorialEngine::runDemoPart2() has been called." << endl; + + Cell* cell = getCell(); + + UpdateSession::open(); + + Net* net = Net::create( cell, "demo" ); + Instance* i1_xr2 = cell->getInstance( "i1_xr2" ); + Plug* plug = i1_xr2->getPlug( i1_xr2->getMasterCell()->getNet("q") ); + plug->setNet( net ); + + RoutingPad* rp1 = RoutingPad::create( net, Occurrence(plug) ); + rp1->setOnBestComponent( RoutingPad::BiggestArea ); + + Instance* i2_xr2 = cell->getInstance( "i2_xr2" ); + plug = i2_xr2->getPlug( i2_xr2->getMasterCell()->getNet("i0") ); + plug->setNet( net ); + + RoutingPad* rp2 = RoutingPad::create( net, Occurrence(plug) ); + rp2->setOnBestComponent( RoutingPad::BiggestArea ); + + Instance* i4_a2 = cell->getInstance( "i4_a2" ); + plug = i4_a2->getPlug( i4_a2->getMasterCell()->getNet("i0") ); + plug->setNet( net ); + + RoutingPad* rp3 = RoutingPad::create( net, Occurrence(plug) ); + rp3->setOnBestComponent( RoutingPad::BiggestArea ); + + UpdateSession::close(); + Breakpoint::stop( 1, "RoutingPad createds" ); + UpdateSession::open(); + + Technology* technology = DataBase::getDB()->getTechnology(); + Layer* metal2 = technology->getLayer( "METAL2" ); + Layer* metal3 = technology->getLayer( "METAL3" ); + Layer* via1 = technology->getLayer( "VIA12" ); + Layer* via2 = technology->getLayer( "VIA23" ); + + Contact* contact1 = Contact::create( rp1, via1, DbU::fromLambda( 0.0), DbU::fromLambda( 0.0) ); + Contact* contact2 = Contact::create( rp2, via1, DbU::fromLambda( 0.0), DbU::fromLambda(-5.0) ); + Contact* contact3 = Contact::create( rp3, via1, DbU::fromLambda( 0.0), DbU::fromLambda( 0.0) ); + Contact* contact4 = Contact::create( net, via2, DbU::fromLambda(50.0), DbU::fromLambda(20.0) ); + Contact* contact5 = Contact::create( net, via2, DbU::fromLambda(50.0), DbU::fromLambda(75.0) ); + + Horizontal::create( contact1, contact4, metal2, DbU::fromLambda(20.0), DbU::fromLambda(2.0) ); + Horizontal::create( contact4, contact2, metal2, DbU::fromLambda(20.0), DbU::fromLambda(2.0) ); + Horizontal::create( contact5, contact3, metal2, DbU::fromLambda(75.0), DbU::fromLambda(2.0) ); + Vertical::create ( contact4, contact5, metal3, DbU::fromLambda(50.0), DbU::fromLambda(2.0) ); + + UpdateSession::close(); + + cout << "All components of " << net << endl; + for ( Component* component : net->getComponents() ) { + cout << "| " << component << endl; + } + Breakpoint::stop( 1, "Contacts and wires createds" ); + UpdateSession::open(); + + contact5->destroy(); + + UpdateSession::close(); + } + + + string TutorialEngine::_getTypeName () const + { return "Tutorial::TutorialEngine"; } + + + string TutorialEngine::_getString () const + { + ostringstream os; + os << "<" << "TutorialEngine " << _cell->getName () << ">"; + return os.str(); + } + + + Record* TutorialEngine::_getRecord () const + { + Record* record = Super::_getRecord (); + + if (record) { + // Add new records here. + } + return record; + } + + +} // Tutorial namespace. diff --git a/tutorial/src/tutorial.py b/tutorial/src/tutorial.py new file mode 100755 index 00000000..bf6a0c5e --- /dev/null +++ b/tutorial/src/tutorial.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python + + +try: + import sys + import os.path + import optparse + import Cfg + import Hurricane + import Viewer + from helpers import showPythonTrace + import CRL + import Unicorn + import Tutorial +except ImportError, e: + serror = str(e) + if serror.startswith('No module named'): + module = serror.split()[-1] + print '[ERROR] The <%s> python module or symbol cannot be loaded.' % module + print ' Please check the integrity of the package.' + if serror.find('cannot open shared object file'): + library = serror.split(':')[0] + print '[ERROR] The <%s> shared library cannot be loaded.' % library + print ' Under RHEL 6, you must be under devtoolset-2.' + print ' (scl enable devtoolset-2 bash)' + sys.exit(1) +except Exception, e: + print '[ERROR] A strange exception occurred while loading the basic Coriolis/Python' + print ' modules. Something may be wrong at Python/C API level.\n' + print ' %s' % e + sys.exit(2) + + +def setCgtBanner ( banner ): + banner.setName('tutu') + banner.setPurpose('Tutorial for Users') + return banner + + +def credits (): + s = '' + s += ' Tool Credits\n' + s += ' Hurricane .................... Remy Escassut & Christian Masson\n' + return s + + +if __name__ == '__main__': + + try: + usage = str(setCgtBanner(CRL.Banner())) + usage += '\ncgt [options]' + + parser = optparse.OptionParser(usage) + parser.add_option( '--no-init' , action='store_true', dest='noInit' , help='Do not load any initialization.') + parser.add_option( '-c', '--cell' , type='string' , dest='cell' , help='The name of the cell to load, whithout extension.') + parser.add_option( '--acm-sigda-89' , type='string' , dest='acmSigdaName' , help='An ACM/SIGDA 89 bench name to load, whithout extension.') + parser.add_option( '--blif' , type='string' , dest='blifName' , help='A Blif (Yosys) design name to load, whithout extension.') + parser.add_option( '--ispd-05' , type='string' , dest='ispd05name' , help='An ISPD 05 bench (placement) name to load, whithout extension.') + parser.add_option( '-v', '--verbose' , action='store_true', dest='verbose' , help='First level of verbosity.') + parser.add_option( '-V', '--very-verbose' , action='store_true', dest='veryVerbose' , help='Second level of verbosity.') + parser.add_option( '-i', '--info' , action='store_true', dest='info' , help='Display lots of informational messages.') + parser.add_option( '--paranoid' , action='store_true', dest='paranoid' , help='Display everything that *may be* suspicious...') + parser.add_option( '-b', '--bug' , action='store_true', dest='bug' , help='Display bug related messages.') + parser.add_option( '--show-conf' , action='store_true', dest='showConf' , help='Display Kite configuration.') + parser.add_option( '-D', '--core-dump' , action='store_true', dest='coreDump' , help='Enable core-dump when a crash occurs.') + parser.add_option( '-L', '--log-mode' , action='store_true', dest='logMode' , help='Disable ANSI escape sequences in console output.') + (options, args) = parser.parse_args() + args.insert(0, 'tutu') + + flags = 0 + if options.noInit: + flags |= CRL.AllianceFramework.NoPythonInit + + af = CRL.AllianceFramework.create( flags ) + print af.getEnvironment().getPrint() + + Cfg.Configuration.pushDefaultPriority(Cfg.Parameter.Priority.CommandLine) + + if options.coreDump: Cfg.getParamBool ('misc.catchCore' ).setBool(False) + if options.verbose: Cfg.getParamBool ('misc.verboseLevel1').setBool(True) + if options.veryVerbose: Cfg.getParamBool ('misc.verboseLevel2').setBool(True) + if options.info: Cfg.getParamBool ('misc.info' ).setBool(True) + if options.paranoid: Cfg.getParamBool ('misc.paranoid' ).setBool(True) + if options.bug: Cfg.getParamBool ('misc.bug' ).setBool(True) + if options.logMode: Cfg.getParamBool ('misc.logMode' ).setBool(True) + if options.showConf: Cfg.getParamBool ('misc.showConf' ).setBool(True) + + Cfg.Configuration.popDefaultPriority() + + cell = None + if options.acmSigdaName: + cell = CRL.AcmSigda.load(options.acmSigdaName) + elif options.ispd05name: + cell = CRL.Ispd05.load(options.ispd05name) + elif options.blifName: + cell = CRL.Blif.load(options.blifName) + elif options.cell: + cell = af.getCell(options.cell, CRL.Catalog.State.Views) + + # Run in graphic mode. + ha = Viewer.HApplication.create(args) + Viewer.Graphics.enable() + + unicorn = Unicorn.UnicornGui.create() + unicorn.setApplicationName ('tutu') + unicorn.registerTool (Tutorial.GraphicTutorialEngine.grab()) + unicorn.setLayerVisible ("grid" , False); + unicorn.setLayerVisible ("text.instance" , False); + unicorn.setLayerVisible ("text.component", False); + + setCgtBanner(unicorn.getBanner()) + print unicorn.getBanner() + print credits() + + if cell: unicorn.setCell(cell) + unicorn.show() + ha.qtExec() + + except Exception, e: + showPythonTrace( sys.argv[0], e ) + + sys.exit(0) diff --git a/tutorial/src/tutorial/GraphicTutorialEngine.h b/tutorial/src/tutorial/GraphicTutorialEngine.h new file mode 100644 index 00000000..07478f33 --- /dev/null +++ b/tutorial/src/tutorial/GraphicTutorialEngine.h @@ -0,0 +1,76 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2017, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | T o o l E n g i n e T u t o r i a l | +// | | +// | Author : Jean-Paul Chaput | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./tutorial/GraphicTutorialEngine.h" | +// +-----------------------------------------------------------------+ + + + +#ifndef TUTORIAL_GRAPHIC_TUTORIAL_ENGINE_H +#define TUTORIAL_GRAPHIC_TUTORIAL_ENGINE_H + +#include +#include + +namespace Hurricane { + class Go; + class BasicLayer; + class Transformation; + class CellWidget; + class CellViewer; +} + +#include "crlcore/GraphicToolEngine.h" +#include "tutorial/TutorialEngine.h" + + +namespace Tutorial { + + using Hurricane::Go; + using Hurricane::Box; + using Hurricane::BasicLayer; + using Hurricane::Transformation; + using Hurricane::CellWidget; + using Hurricane::CellViewer; + using CRL::GraphicTool; + + +// ------------------------------------------------------------------- +// Class : "Tutorial::GraphicTutorialEngine". + + class GraphicTutorialEngine : public GraphicTool { + Q_OBJECT; + + public: + TutorialEngine* createEngine (); + TutorialEngine* getForFramework (); + static GraphicTutorialEngine* grab (); + virtual const Name& getName () const; + Cell* getCell (); + virtual size_t release (); + virtual void addToMenu ( CellViewer* ); + void postEvent (); + protected: + GraphicTutorialEngine (); + virtual ~GraphicTutorialEngine (); + void _runDemoPart1 (); + void _runDemoPart2 (); + protected: + static size_t _references; + static GraphicTutorialEngine* _singleton; + CellViewer* _viewer; + }; + + +} // Tutorial namespace. + +#endif // TUTORIAL_GRAPHIC_TUTORIAL_ENGINE_H diff --git a/tutorial/src/tutorial/PyGraphicTutorialEngine.h b/tutorial/src/tutorial/PyGraphicTutorialEngine.h new file mode 100644 index 00000000..546b6d49 --- /dev/null +++ b/tutorial/src/tutorial/PyGraphicTutorialEngine.h @@ -0,0 +1,55 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2017, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | T o o l E n g i n e T u t o r i a l | +// | | +// | Author : Jean-Paul Chaput | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./tutorial/PyGraphicTutorialEngine.h" | +// +-----------------------------------------------------------------+ + + +#ifndef TUTORIAL_PY_GRAPHIC_TUTORIAL_ENGINE_H +#define TUTORIAL_PY_GRAPHIC_TUTORIAL_ENGINE_H + +#include "crlcore/PyGraphicToolEngine.h" +#include "tutorial/GraphicTutorialEngine.h" + + +namespace Tutorial { + +extern "C" { + + +// ------------------------------------------------------------------- +// Python Object : "PyGraphicTutorialEngine". + + typedef struct { + CRL::PyGraphicTool _baseObject; + } PyGraphicTutorialEngine; + + +// ------------------------------------------------------------------- +// Functions & Types exported to "PyTutorial.ccp". + + extern PyTypeObject PyTypeGraphicTutorialEngine; + extern PyMethodDef PyGraphicTutorialEngine_Methods[]; + + extern void PyGraphicTutorialEngine_LinkPyType (); + + +#define IsPyGraphicTutorialEngine(v) ( (v)->ob_type == &PyTypeGraphicTutorialEngine ) +#define PY_GRAPHIC_TUTORIAL_ENGINE(v) ( (PyGraphicTutorialEngine*)(v) ) +#define PY_GRAPHIC_TUTORIAL_ENGINE_O(v) ( PY_GRAPHIC_TUTORIAL_ENGINE(v)->_baseObject._object ) + + +} // extern "C". + +} // Tutorial namespace. + +#endif // TUTORIAL_PY_GRAPHIC_TUTORIAL_ENGINE_H diff --git a/tutorial/src/tutorial/PyTutorialEngine.h b/tutorial/src/tutorial/PyTutorialEngine.h new file mode 100644 index 00000000..6b38dde4 --- /dev/null +++ b/tutorial/src/tutorial/PyTutorialEngine.h @@ -0,0 +1,58 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2017, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | T o o l E n g i n e T u t o r i a l | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./tutorial/PyTutorialEngine.cpp" | +// +-----------------------------------------------------------------+ + + +#ifndef PY_TUTORIAL_ENGINE_H +#define PY_TUTORIAL_ENGINE_H + +#include "hurricane/isobar/PyHurricane.h" +#include "crlcore/PyToolEngine.h" +#include "tutorial/TutorialEngine.h" + + +namespace Tutorial { + +extern "C" { + + +// ------------------------------------------------------------------- +// Python Object : "PyTutorialEngine". + + typedef struct { + CRL::PyToolEngine _baseObject; + } PyTutorialEngine; + + +// ------------------------------------------------------------------- +// Functions & Types exported to "PyTutorial.ccp". + + extern PyTypeObject PyTypeTutorialEngine; + extern PyMethodDef PyTutorialEngine_Methods[]; + + extern PyObject* PyTutorialEngine_Link ( Tutorial::TutorialEngine* ); + extern void PyTutorialEngine_LinkPyType (); + extern void PyTutorialEngine_postModuleInit (); + + +#define IsPyTutorialEngine(v) ( (v)->ob_type == &PyTypeTutorialEngine ) +#define PYTUTORIALENGINE(v) ( (PyTutorialEngine*)(v) ) +#define PYTUTORIALENGINE_O(v) ( PYTUTORIALENGINE(v)->_baseObject._object ) + + +} // extern "C". + +} // Tutorial namespace. + +#endif // PY_TUTORIAL_ENGINE_H diff --git a/tutorial/src/tutorial/TutorialEngine.h b/tutorial/src/tutorial/TutorialEngine.h new file mode 100644 index 00000000..26f50889 --- /dev/null +++ b/tutorial/src/tutorial/TutorialEngine.h @@ -0,0 +1,93 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2017, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | T o o l E n g i n e T u t o r i a l | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./tutorial/TutorialEngine.h" | +// +-----------------------------------------------------------------+ + + +#ifndef TUTORIAL_TUTORIAL_ENGINE_H +#define TUTORIAL_TUTORIAL_ENGINE_H + +#include +#include + +#include "hurricane/Name.h" +namespace Hurricane { + class Layer; + class Net; + class Cell; + class CellViewer; +} + +#include "crlcore/ToolEngine.h" + + +namespace Tutorial { + + using Hurricane::Record; + using Hurricane::Name; + using Hurricane::Layer; + using Hurricane::Net; + using Hurricane::Cell; + using Hurricane::CellViewer; + using CRL::ToolEngine; + + +// ------------------------------------------------------------------- +// Class : "Tutorial::TutorialEngine". + + class TutorialEngine : public ToolEngine { + public: + typedef ToolEngine Super; + public: + static const Name& staticGetName (); + static TutorialEngine* create ( Cell* ); + static TutorialEngine* get ( const Cell* ); + public: + inline CellViewer* getViewer () const; + inline ToolEngine* base (); + virtual const Name& getName () const; + inline void setViewer ( CellViewer* ); + Cell* runDemoPart1 (); + void runDemoPart2 (); + virtual Record* _getRecord () const; + virtual std::string _getString () const; + virtual std::string _getTypeName () const; + protected: + // Constructors & Destructors. + TutorialEngine ( Cell* ); + virtual ~TutorialEngine (); + virtual void _postCreate (); + virtual void _preDestroy (); + private: + TutorialEngine ( const TutorialEngine& ); + TutorialEngine& operator= ( const TutorialEngine& ); + private: + // Attributes. + static Name _toolName; + protected: + CellViewer* _viewer; + }; + + +// Inline Functions. + inline CellViewer* TutorialEngine::getViewer () const { return _viewer; } + inline ToolEngine* TutorialEngine::base () { return static_cast(this); } + inline void TutorialEngine::setViewer ( CellViewer* viewer ) { _viewer=viewer; } + + +} // Tutorial namespace. + + +INSPECTOR_P_SUPPORT(Tutorial::TutorialEngine); + +#endif // TUTORIAL_TUTORIAL_ENGINE_H