Added C++ & Python tutorial code."
This commit is contained in:
parent
62a433ad3c
commit
51d5313801
|
@ -30,6 +30,7 @@ projects = [
|
||||||
, "equinox"
|
, "equinox"
|
||||||
, "solstice"
|
, "solstice"
|
||||||
, "unicorn"
|
, "unicorn"
|
||||||
|
, "tutorial"
|
||||||
#, "testbench"
|
#, "testbench"
|
||||||
#, "ispd"
|
#, "ispd"
|
||||||
, "cumulus"
|
, "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