2017-12-01 07:17:47 -06:00
|
|
|
#!/usr/bin/env python
|
|
|
|
#
|
|
|
|
# This file is part of the Coriolis Software.
|
Comprehensive reorganisation of the Python part of Coriolis.
* Move all Python stuff under a common Python namespace "coriolis".
* Instead of having a series subtrees for each tool, integrate
everything in one common tree. So now, all components can be
located either with an absolute path from "coriolis" or, inside
cross-reference themselves through relatives imports.
* As a consequence, we only need to add ".../site-packages/coriolis/"
to the PYTHONPATH, and not a whole bunch of subdirectories.
And nothing, if installed in-system.
* The tree of free technologies configuration files is also moved
below "coriolis/technos" instead of "/etc".
* Supressed "cumulus" level for the plugins.
* All python modules are rewritten using relative imports except
for the configuration files that uses absolute import as they
can be cloned outside of the tree to serve as templates.
* Change: In boostrap/FindPythonSitePackages, include "/coriolis" in
Python_CORIOLISARCH and Python_CORIOLISLIB.
Provide a Python_SITELIB *without* "/coriolis" appended.
* Change: In cumulus/plugins/__init__.loadPlugins(), must prefix modules
read in the plugins directory by "coriolis.plugins.". No longer need
to add their path to sys.path.
* Change: In crlcore/python/technos/nodeX/*/devices.py, the scripts of
the layouts generators must be prefixed by "coriolis.oroshi.".
* Change: In CRL::System CTOR, no longer add the pathes of the various
plugins to sys.path. Only "site-packages/coriolis/".
* New: In Utilities::Path::toPyModePath(), new method to convert a
filesystem path into a python module path.
Examples:
"coriolis/plugins/block" --> "coriolis.plugins.block".
"coriolis/plugins/rsave.py" --> "coriolis.plugins.rsave".
* Change: In katanaEngine::_runKatanaEngine(), rename the hook script
initHook.py. No longer need to modify sys.path.
* Change: In BoraEngine::_runBoraEngine(), rename the hook script
initHook.py. No longer need to modify sys.path.
* Change: In UnicornGui::_runUnicornInit(), rename the hook script
initHook.py. No longer need to modify sys.path.
* Change: In cumulus.plugins.chip.constants, put the constants
outside __init__.py to avoid a loop at initialization.
2023-02-27 15:14:32 -06:00
|
|
|
# Copyright (c) Sorbonne Université 2017-2023, All Rights Reserved
|
2017-12-01 07:17:47 -06:00
|
|
|
#
|
|
|
|
# +-----------------------------------------------------------------+
|
|
|
|
# | 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 |
|
|
|
|
# | =============================================================== |
|
Migration towards Python3, first stage: still based on C-Macros.
* New: Python/C++ API level:
* Write a new C++/template wrapper to get rid of boost::python
* The int & long Python type are now merged. So a C/C++ level,
it became "PyLong_X" (remove "PyInt_X") and at Python code
level, it became "int" (remove "long").
* Change: VLSISAPD finally defunct.
* Configuration is now integrated as a Hurricane component,
makes use of the new C++/template wrapper.
* vlsisapd is now defunct. Keep it in the source for now as
some remaining non essential code may have to be ported in
the future.
* Note: Python code (copy of the migration howto):
* New print function syntax print().
* Changed "dict.has_key(k)" for "k" in dict.
* Changed "except Exception, e" for "except Exception as e".
* The division "/" is now the floating point division, even if
both operand are integers. So 3/2 now gives 1.5 and no longer 1.
The integer division is now "//" : 1 = 3//2. So have to carefully
review the code to update. Most of the time we want to use "//".
We must never change to float for long that, in fact, represents
DbU (exposed as Python int type).
* execfile() must be replaced by exec(open("file").read()).
* iter().__next__() becomes iter(x).__next__().
* __getslice__() has been removed, integrated to __getitem__().
* The formating used for str(type(o)) has changed, so In Stratus,
have to update them ("<class 'MyClass'>" instead of "MyClass").
* the "types" module no longer supply values for default types
like str (types.StringType) or list (types.StringType).
Must use "isinstance()" where they were occuring.
* Remove the 'L' to indicate "long integer" (like "12L"), now
all Python integer are long.
* Change in bootstrap:
* Ported Coriolis builder (ccb) to Python3.
* Ported Coriolis socInstaller.py to Python3.
* Note: In PyQt4+Python3, QVariant no longer exists. Use None or
directly convert using the python syntax: bool(x), int(x), ...
By default, it is a string (str).
* Note: PyQt4 bindings & Python3 under SL7.
* In order to compile user's must upgrade to my own rebuild of
PyQt 4 & 5 bindings 4.19.21-1.el7.soc.
* Bug: In cumulus/plugins.block.htree.HTree.splitNet(), set the root
buffer of the H-Tree to the original signal (mainly: top clock).
Strangely, it was only done when working in full chip mode.
2021-09-19 12:41:24 -05:00
|
|
|
# | Python : "./runDemo.py" |
|
2017-12-01 07:17:47 -06:00
|
|
|
# +-----------------------------------------------------------------+
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
Migration towards Python3, first stage: still based on C-Macros.
* New: Python/C++ API level:
* Write a new C++/template wrapper to get rid of boost::python
* The int & long Python type are now merged. So a C/C++ level,
it became "PyLong_X" (remove "PyInt_X") and at Python code
level, it became "int" (remove "long").
* Change: VLSISAPD finally defunct.
* Configuration is now integrated as a Hurricane component,
makes use of the new C++/template wrapper.
* vlsisapd is now defunct. Keep it in the source for now as
some remaining non essential code may have to be ported in
the future.
* Note: Python code (copy of the migration howto):
* New print function syntax print().
* Changed "dict.has_key(k)" for "k" in dict.
* Changed "except Exception, e" for "except Exception as e".
* The division "/" is now the floating point division, even if
both operand are integers. So 3/2 now gives 1.5 and no longer 1.
The integer division is now "//" : 1 = 3//2. So have to carefully
review the code to update. Most of the time we want to use "//".
We must never change to float for long that, in fact, represents
DbU (exposed as Python int type).
* execfile() must be replaced by exec(open("file").read()).
* iter().__next__() becomes iter(x).__next__().
* __getslice__() has been removed, integrated to __getitem__().
* The formating used for str(type(o)) has changed, so In Stratus,
have to update them ("<class 'MyClass'>" instead of "MyClass").
* the "types" module no longer supply values for default types
like str (types.StringType) or list (types.StringType).
Must use "isinstance()" where they were occuring.
* Remove the 'L' to indicate "long integer" (like "12L"), now
all Python integer are long.
* Change in bootstrap:
* Ported Coriolis builder (ccb) to Python3.
* Ported Coriolis socInstaller.py to Python3.
* Note: In PyQt4+Python3, QVariant no longer exists. Use None or
directly convert using the python syntax: bool(x), int(x), ...
By default, it is a string (str).
* Note: PyQt4 bindings & Python3 under SL7.
* In order to compile user's must upgrade to my own rebuild of
PyQt 4 & 5 bindings 4.19.21-1.el7.soc.
* Bug: In cumulus/plugins.block.htree.HTree.splitNet(), set the root
buffer of the H-Tree to the original signal (mainly: top clock).
Strangely, it was only done when working in full chip mode.
2021-09-19 12:41:24 -05:00
|
|
|
import sys
|
|
|
|
import os.path
|
Comprehensive reorganisation of the Python part of Coriolis.
* Move all Python stuff under a common Python namespace "coriolis".
* Instead of having a series subtrees for each tool, integrate
everything in one common tree. So now, all components can be
located either with an absolute path from "coriolis" or, inside
cross-reference themselves through relatives imports.
* As a consequence, we only need to add ".../site-packages/coriolis/"
to the PYTHONPATH, and not a whole bunch of subdirectories.
And nothing, if installed in-system.
* The tree of free technologies configuration files is also moved
below "coriolis/technos" instead of "/etc".
* Supressed "cumulus" level for the plugins.
* All python modules are rewritten using relative imports except
for the configuration files that uses absolute import as they
can be cloned outside of the tree to serve as templates.
* Change: In boostrap/FindPythonSitePackages, include "/coriolis" in
Python_CORIOLISARCH and Python_CORIOLISLIB.
Provide a Python_SITELIB *without* "/coriolis" appended.
* Change: In cumulus/plugins/__init__.loadPlugins(), must prefix modules
read in the plugins directory by "coriolis.plugins.". No longer need
to add their path to sys.path.
* Change: In crlcore/python/technos/nodeX/*/devices.py, the scripts of
the layouts generators must be prefixed by "coriolis.oroshi.".
* Change: In CRL::System CTOR, no longer add the pathes of the various
plugins to sys.path. Only "site-packages/coriolis/".
* New: In Utilities::Path::toPyModePath(), new method to convert a
filesystem path into a python module path.
Examples:
"coriolis/plugins/block" --> "coriolis.plugins.block".
"coriolis/plugins/rsave.py" --> "coriolis.plugins.rsave".
* Change: In katanaEngine::_runKatanaEngine(), rename the hook script
initHook.py. No longer need to modify sys.path.
* Change: In BoraEngine::_runBoraEngine(), rename the hook script
initHook.py. No longer need to modify sys.path.
* Change: In UnicornGui::_runUnicornInit(), rename the hook script
initHook.py. No longer need to modify sys.path.
* Change: In cumulus.plugins.chip.constants, put the constants
outside __init__.py to avoid a loop at initialization.
2023-02-27 15:14:32 -06:00
|
|
|
from coriolis.Hurricane import DataBase, Breakpoint, DbU, Box, Contact, \
|
|
|
|
Vertical, Horizontal, Net, Cell
|
|
|
|
from coriolis import Cfg
|
|
|
|
from coriolis import Viewer
|
|
|
|
from coriolis import CRL
|
|
|
|
from coriolis.helpers import trace, l, u, n
|
|
|
|
from coriolis.helpers.io import showPythonTrace, ErrorMessage, WarningMessage
|
|
|
|
from coriolis.helpers.overlay import UpdateSession
|
|
|
|
import coriolis.cumulus.plugins as plugins
|
Migration towards Python3, first stage: still based on C-Macros.
* New: Python/C++ API level:
* Write a new C++/template wrapper to get rid of boost::python
* The int & long Python type are now merged. So a C/C++ level,
it became "PyLong_X" (remove "PyInt_X") and at Python code
level, it became "int" (remove "long").
* Change: VLSISAPD finally defunct.
* Configuration is now integrated as a Hurricane component,
makes use of the new C++/template wrapper.
* vlsisapd is now defunct. Keep it in the source for now as
some remaining non essential code may have to be ported in
the future.
* Note: Python code (copy of the migration howto):
* New print function syntax print().
* Changed "dict.has_key(k)" for "k" in dict.
* Changed "except Exception, e" for "except Exception as e".
* The division "/" is now the floating point division, even if
both operand are integers. So 3/2 now gives 1.5 and no longer 1.
The integer division is now "//" : 1 = 3//2. So have to carefully
review the code to update. Most of the time we want to use "//".
We must never change to float for long that, in fact, represents
DbU (exposed as Python int type).
* execfile() must be replaced by exec(open("file").read()).
* iter().__next__() becomes iter(x).__next__().
* __getslice__() has been removed, integrated to __getitem__().
* The formating used for str(type(o)) has changed, so In Stratus,
have to update them ("<class 'MyClass'>" instead of "MyClass").
* the "types" module no longer supply values for default types
like str (types.StringType) or list (types.StringType).
Must use "isinstance()" where they were occuring.
* Remove the 'L' to indicate "long integer" (like "12L"), now
all Python integer are long.
* Change in bootstrap:
* Ported Coriolis builder (ccb) to Python3.
* Ported Coriolis socInstaller.py to Python3.
* Note: In PyQt4+Python3, QVariant no longer exists. Use None or
directly convert using the python syntax: bool(x), int(x), ...
By default, it is a string (str).
* Note: PyQt4 bindings & Python3 under SL7.
* In order to compile user's must upgrade to my own rebuild of
PyQt 4 & 5 bindings 4.19.21-1.el7.soc.
* Bug: In cumulus/plugins.block.htree.HTree.splitNet(), set the root
buffer of the H-Tree to the original signal (mainly: top clock).
Strangely, it was only done when working in full chip mode.
2021-09-19 12:41:24 -05:00
|
|
|
except ImportError as e:
|
|
|
|
serror = str(e)
|
|
|
|
if serror.startswith('No module named'):
|
|
|
|
module = serror.split()[-1]
|
|
|
|
print( '[ERROR] The "{}" python module or symbol cannot be loaded.'.format(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 "{}" shared library cannot be loaded.'.format(library) )
|
|
|
|
sys.exit(1)
|
|
|
|
except Exception as 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( ' {}'.format(e) )
|
|
|
|
sys.exit(2)
|
2017-12-01 07:17:47 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def runDemo ( cell, editor ):
|
Migration towards Python3, first stage: still based on C-Macros.
* New: Python/C++ API level:
* Write a new C++/template wrapper to get rid of boost::python
* The int & long Python type are now merged. So a C/C++ level,
it became "PyLong_X" (remove "PyInt_X") and at Python code
level, it became "int" (remove "long").
* Change: VLSISAPD finally defunct.
* Configuration is now integrated as a Hurricane component,
makes use of the new C++/template wrapper.
* vlsisapd is now defunct. Keep it in the source for now as
some remaining non essential code may have to be ported in
the future.
* Note: Python code (copy of the migration howto):
* New print function syntax print().
* Changed "dict.has_key(k)" for "k" in dict.
* Changed "except Exception, e" for "except Exception as e".
* The division "/" is now the floating point division, even if
both operand are integers. So 3/2 now gives 1.5 and no longer 1.
The integer division is now "//" : 1 = 3//2. So have to carefully
review the code to update. Most of the time we want to use "//".
We must never change to float for long that, in fact, represents
DbU (exposed as Python int type).
* execfile() must be replaced by exec(open("file").read()).
* iter().__next__() becomes iter(x).__next__().
* __getslice__() has been removed, integrated to __getitem__().
* The formating used for str(type(o)) has changed, so In Stratus,
have to update them ("<class 'MyClass'>" instead of "MyClass").
* the "types" module no longer supply values for default types
like str (types.StringType) or list (types.StringType).
Must use "isinstance()" where they were occuring.
* Remove the 'L' to indicate "long integer" (like "12L"), now
all Python integer are long.
* Change in bootstrap:
* Ported Coriolis builder (ccb) to Python3.
* Ported Coriolis socInstaller.py to Python3.
* Note: In PyQt4+Python3, QVariant no longer exists. Use None or
directly convert using the python syntax: bool(x), int(x), ...
By default, it is a string (str).
* Note: PyQt4 bindings & Python3 under SL7.
* In order to compile user's must upgrade to my own rebuild of
PyQt 4 & 5 bindings 4.19.21-1.el7.soc.
* Bug: In cumulus/plugins.block.htree.HTree.splitNet(), set the root
buffer of the H-Tree to the original signal (mainly: top clock).
Strangely, it was only done when working in full chip mode.
2021-09-19 12:41:24 -05:00
|
|
|
print( 'runDemo() Python plugin function has been called.' )
|
2017-12-01 07:17:47 -06:00
|
|
|
if cell:
|
Migration towards Python3, first stage: still based on C-Macros.
* New: Python/C++ API level:
* Write a new C++/template wrapper to get rid of boost::python
* The int & long Python type are now merged. So a C/C++ level,
it became "PyLong_X" (remove "PyInt_X") and at Python code
level, it became "int" (remove "long").
* Change: VLSISAPD finally defunct.
* Configuration is now integrated as a Hurricane component,
makes use of the new C++/template wrapper.
* vlsisapd is now defunct. Keep it in the source for now as
some remaining non essential code may have to be ported in
the future.
* Note: Python code (copy of the migration howto):
* New print function syntax print().
* Changed "dict.has_key(k)" for "k" in dict.
* Changed "except Exception, e" for "except Exception as e".
* The division "/" is now the floating point division, even if
both operand are integers. So 3/2 now gives 1.5 and no longer 1.
The integer division is now "//" : 1 = 3//2. So have to carefully
review the code to update. Most of the time we want to use "//".
We must never change to float for long that, in fact, represents
DbU (exposed as Python int type).
* execfile() must be replaced by exec(open("file").read()).
* iter().__next__() becomes iter(x).__next__().
* __getslice__() has been removed, integrated to __getitem__().
* The formating used for str(type(o)) has changed, so In Stratus,
have to update them ("<class 'MyClass'>" instead of "MyClass").
* the "types" module no longer supply values for default types
like str (types.StringType) or list (types.StringType).
Must use "isinstance()" where they were occuring.
* Remove the 'L' to indicate "long integer" (like "12L"), now
all Python integer are long.
* Change in bootstrap:
* Ported Coriolis builder (ccb) to Python3.
* Ported Coriolis socInstaller.py to Python3.
* Note: In PyQt4+Python3, QVariant no longer exists. Use None or
directly convert using the python syntax: bool(x), int(x), ...
By default, it is a string (str).
* Note: PyQt4 bindings & Python3 under SL7.
* In order to compile user's must upgrade to my own rebuild of
PyQt 4 & 5 bindings 4.19.21-1.el7.soc.
* Bug: In cumulus/plugins.block.htree.HTree.splitNet(), set the root
buffer of the H-Tree to the original signal (mainly: top clock).
Strangely, it was only done when working in full chip mode.
2021-09-19 12:41:24 -05:00
|
|
|
print( WarningMessage( 'A Cell "{}" is already loaded in the Viewer, cowardly exiting.' \
|
|
|
|
.format(cell.getName()) ))
|
|
|
|
return
|
2017-12-01 07:17:47 -06:00
|
|
|
library = CRL.AllianceFramework.get().getLibrary( 0 )
|
|
|
|
cell = CRL.AllianceFramework.get().getCell( 'demo_cell', CRL.Catalog.State.Views )
|
|
|
|
if cell:
|
Migration towards Python3, first stage: still based on C-Macros.
* New: Python/C++ API level:
* Write a new C++/template wrapper to get rid of boost::python
* The int & long Python type are now merged. So a C/C++ level,
it became "PyLong_X" (remove "PyInt_X") and at Python code
level, it became "int" (remove "long").
* Change: VLSISAPD finally defunct.
* Configuration is now integrated as a Hurricane component,
makes use of the new C++/template wrapper.
* vlsisapd is now defunct. Keep it in the source for now as
some remaining non essential code may have to be ported in
the future.
* Note: Python code (copy of the migration howto):
* New print function syntax print().
* Changed "dict.has_key(k)" for "k" in dict.
* Changed "except Exception, e" for "except Exception as e".
* The division "/" is now the floating point division, even if
both operand are integers. So 3/2 now gives 1.5 and no longer 1.
The integer division is now "//" : 1 = 3//2. So have to carefully
review the code to update. Most of the time we want to use "//".
We must never change to float for long that, in fact, represents
DbU (exposed as Python int type).
* execfile() must be replaced by exec(open("file").read()).
* iter().__next__() becomes iter(x).__next__().
* __getslice__() has been removed, integrated to __getitem__().
* The formating used for str(type(o)) has changed, so In Stratus,
have to update them ("<class 'MyClass'>" instead of "MyClass").
* the "types" module no longer supply values for default types
like str (types.StringType) or list (types.StringType).
Must use "isinstance()" where they were occuring.
* Remove the 'L' to indicate "long integer" (like "12L"), now
all Python integer are long.
* Change in bootstrap:
* Ported Coriolis builder (ccb) to Python3.
* Ported Coriolis socInstaller.py to Python3.
* Note: In PyQt4+Python3, QVariant no longer exists. Use None or
directly convert using the python syntax: bool(x), int(x), ...
By default, it is a string (str).
* Note: PyQt4 bindings & Python3 under SL7.
* In order to compile user's must upgrade to my own rebuild of
PyQt 4 & 5 bindings 4.19.21-1.el7.soc.
* Bug: In cumulus/plugins.block.htree.HTree.splitNet(), set the root
buffer of the H-Tree to the original signal (mainly: top clock).
Strangely, it was only done when working in full chip mode.
2021-09-19 12:41:24 -05:00
|
|
|
print( WarningMessage( '"demo_cell" has already been created, do not run twice.' ))
|
|
|
|
return
|
2022-08-15 06:49:35 -05:00
|
|
|
with UpdateSession():
|
|
|
|
cell = Cell.create( library, 'demo_cell' )
|
|
|
|
cell.setAbutmentBox( Box( l( 0.0), l( 0.0), l(15.0), l(50.0) ) )
|
2017-12-01 07:17:47 -06:00
|
|
|
|
|
|
|
if editor: editor.setCell( cell )
|
2020-03-10 06:22:03 -05:00
|
|
|
Breakpoint.stop( 1, 'Abutment box has been drawn.' )
|
2022-08-15 06:49:35 -05:00
|
|
|
with UpdateSession():
|
|
|
|
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, l(39.0), l(24.0), l(0.0), l(15.0) )
|
|
|
|
vss = Net.create( cell, 'vss' )
|
|
|
|
vdd = Net.create( cell, 'vdd' )
|
|
|
|
Horizontal.create( vss, metal1 , l(3.0), l(6.0), l(0.0), l(15.0) )
|
|
|
|
Vertical.create ( vss, diffN , l(3.5), l(4.0), l(4.0), l(12.0) )
|
|
|
|
Contact.create ( vss, contDiffN, l(4.0), l(5.0) )
|
|
|
|
Horizontal.create( vdd, metal1 , l(47.0), l( 6.0), l( 0.0), l(15.0) )
|
|
|
|
Vertical.create ( vdd, diffP , l( 3.5), l( 4.0), l(28.0), l(46.0) )
|
|
|
|
Contact.create ( vdd, contDiffP, l( 4.0), l(45.0) )
|
2020-03-10 06:22:03 -05:00
|
|
|
Breakpoint.stop( 1, 'Power nets have been drawn.' )
|
2017-12-01 07:17:47 -06:00
|
|
|
|
2022-08-15 06:49:35 -05:00
|
|
|
with UpdateSession():
|
|
|
|
nq = Net.create( cell, 'nq' )
|
|
|
|
Vertical.create ( nq, diffN , l(10.0), l( 3.0), l( 8.0), l(12.0) )
|
|
|
|
Vertical.create ( nq, diffP , l(10.0), l( 3.0), l(28.0), l(37.0) )
|
|
|
|
Contact.create ( nq, contDiffN, l(10.0), l(10.0) )
|
|
|
|
Contact.create ( nq, contDiffP, l(10.0), l(30.0) )
|
|
|
|
Contact.create ( nq, contDiffP, l(10.0), l(35.0) )
|
|
|
|
Vertical.create ( nq, metal1 , l(10.0), l( 2.0), l(10.0), l(40.0) )
|
2020-03-10 06:22:03 -05:00
|
|
|
Breakpoint.stop( 1, 'Output has been drawn.' )
|
2017-12-01 07:17:47 -06:00
|
|
|
|
2022-08-15 06:49:35 -05:00
|
|
|
with UpdateSession():
|
|
|
|
i = Net.create( cell, 'i' )
|
|
|
|
Vertical.create ( i, ntrans , l( 7.0), l( 1.0), l( 6.0), l(14.0) )
|
|
|
|
Vertical.create ( i, poly , l( 7.0), l( 1.0), l(14.0), l(26.0) )
|
|
|
|
Vertical.create ( i, ptrans , l( 7.0), l( 1.0), l(26.0), l(39.0) )
|
|
|
|
Horizontal.create( i, poly , l(20.0), l( 3.0), l( 4.0), l( 7.0) )
|
|
|
|
Contact.create ( i, contPoly , l( 5.0), l(20.0) )
|
|
|
|
Vertical.create ( i, metal1 , l( 5.0), l( 2.0), l(10.0), l(40.0) )
|
2020-03-10 06:22:03 -05:00
|
|
|
Breakpoint.stop( 1, 'Input has been drawn.' )
|
2017-12-01 07:17:47 -06:00
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------------------------------------
|
|
|
|
# Plugin hook functions, unicornHook:menus, ScritMain:call
|
|
|
|
|
|
|
|
def unicornHook ( **kw ):
|
2022-08-15 06:49:35 -05:00
|
|
|
"""
|
|
|
|
The mandatory function to make the plugin appears in the menus.
|
|
|
|
"""
|
|
|
|
|
2017-12-01 07:17:47 -06:00
|
|
|
editor = kw['editor']
|
|
|
|
editor.addMenu( 'tutorials' , 'Tutorials', Viewer.CellViewer.TopMenu )
|
2019-03-05 16:23:14 -06:00
|
|
|
#editor.addMenu( 'tutorials.plugins', 'Plugins' , Viewer.CellViewer.NoFlags )
|
|
|
|
plugins.kwUnicornHook( 'tutorials.runDemo'
|
|
|
|
, 'Run Demo (Python flavor)'
|
2017-12-01 07:17:47 -06:00
|
|
|
, 'Launch runDemo() in the Tutorial Python plugin.'
|
|
|
|
, sys.modules[__name__].__file__
|
|
|
|
, **kw
|
|
|
|
)
|
|
|
|
return
|
|
|
|
|
|
|
|
|
2020-04-08 04:24:42 -05:00
|
|
|
def scriptMain ( **kw ):
|
2022-08-15 06:49:35 -05:00
|
|
|
"""
|
|
|
|
The mandatory function from which a plugin will be called by Coriolis CGT/Unicorn.
|
|
|
|
"""
|
|
|
|
|
|
|
|
try:
|
|
|
|
helpers.staticInitialization( quiet=True )
|
|
|
|
#helpers.setTraceLevel( 550 )
|
|
|
|
Breakpoint.setStopLevel( 1 )
|
|
|
|
print( ' o Breakpoint level: {}.'.format(Breakpoint.getStopLevel()) )
|
|
|
|
cell, editor = plugins.kwParseMain( **kw )
|
|
|
|
runDemo( cell, editor )
|
|
|
|
except Exception as e:
|
|
|
|
helpers.io.catch( e )
|
|
|
|
return 0
|