Added C++ & Python tutorial code."
This commit is contained in:
parent
62a433ad3c
commit
51d5313801
|
@ -30,6 +30,7 @@ projects = [
|
|||
, "equinox"
|
||||
, "solstice"
|
||||
, "unicorn"
|
||||
, "tutorial"
|
||||
#, "testbench"
|
||||
#, "ispd"
|
||||
, "cumulus"
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
# -*- explicit-buffer-name: "CMakeLists.txt<tutorial>" -*-
|
||||
|
||||
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()
|
|
@ -0,0 +1,3 @@
|
|||
# -*- explicit-buffer-name: "CMakeLists.txt<tutorial/python>" -*-
|
||||
|
||||
install ( FILES runDemo.py DESTINATION ${PYTHON_SITE_PACKAGES}/cumulus/plugins )
|
|
@ -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 <coriolis> 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
|
|
@ -0,0 +1,64 @@
|
|||
# -*- explicit-buffer-name: "CMakeLists.txt<tutorial/src>" -*-
|
||||
|
||||
# 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 )
|
||||
|
||||
|
|
@ -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 <boost/bind.hpp>
|
||||
#include <QAction>
|
||||
#include <QMenu>
|
||||
#include <QMenuBar>
|
||||
#include <QApplication>
|
||||
#include <hurricane/Warning.h>
|
||||
#include <hurricane/Error.h>
|
||||
#include <hurricane/Breakpoint.h>
|
||||
#include <hurricane/DebugSession.h>
|
||||
#include <hurricane/Go.h>
|
||||
#include <hurricane/Net.h>
|
||||
#include <hurricane/Cell.h>
|
||||
#include <hurricane/viewer/Graphics.h>
|
||||
#include <hurricane/viewer/CellWidget.h>
|
||||
#include <hurricane/viewer/CellViewer.h>
|
||||
#include <hurricane/viewer/ControllerWidget.h>
|
||||
#include <hurricane/viewer/ExceptionWidget.h>
|
||||
#include <crlcore/Utilities.h>
|
||||
#include <crlcore/AllianceFramework.h>
|
||||
#include <tutorial/GraphicTutorialEngine.h>
|
||||
|
||||
|
||||
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( "<b>Tutorial:</b> GraphicTutorialEngine not bound to any Viewer." );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (_viewer->getCell() == NULL) {
|
||||
throw Error( "<b>Tutorial:</b> 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.
|
|
@ -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.
|
|
@ -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.
|
|
@ -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 <functional>
|
||||
|
||||
# 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.
|
||||
|
|
@ -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 <Python.h>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
#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<TutorialEngine*>(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.
|
|
@ -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 <coriolis> 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)
|
|
@ -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 <functional>
|
||||
#include <QObject>
|
||||
|
||||
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
|
|
@ -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
|
|
@ -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
|
|
@ -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 <string>
|
||||
#include <iostream>
|
||||
|
||||
#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<ToolEngine*>(this); }
|
||||
inline void TutorialEngine::setViewer ( CellViewer* viewer ) { _viewer=viewer; }
|
||||
|
||||
|
||||
} // Tutorial namespace.
|
||||
|
||||
|
||||
INSPECTOR_P_SUPPORT(Tutorial::TutorialEngine);
|
||||
|
||||
#endif // TUTORIAL_TUTORIAL_ENGINE_H
|
Loading…
Reference in New Issue