This page expands the Scripting section of the documentation.
[TOC]
Assuming that there is PROC1 in toplevel PARENT, the following code
tl = Toplevel(DMUID.parse("WORK.PARENT"), None)
module = project.getIGM().findModule(tl)
proc1 = module.findChild("PROC1")
printf("%s : %s", module, proc1)
prints
IGModule(duuid=WORK.PARENT(ARCH)) : process (id=PROC1)
To address instantiation which looks like DUT: entity WORK.child; use getSignature:
dut = project.getIGM().findModule(module.findChild("DUT").getSignature());
printf("%s", dut)
Further, we can list the items, declared by the modules and processes
procItems = proc1.getContainer().localItems()
p1Names = [str(l.getId()) for l in procItems]
printf("P1 objects are: %s", ','.join(p1Names))
and filter for variables only
from org.zamia.instgraph import IGObject
import org.zamia.instgraph.IGObject.IGObjectCat
import org.zamia.instgraph.IGObject.OIDir
p1Vars = [str(l.getId()) for l in proc1.getContainer().localItems()
if isinstance(l, org.zamia.instgraph.IGObject) and l.getCat() == IGObject.IGObjectCat.VARIABLE]
printf("P1 variables are: %s", ','.join(p1Vars))
To list module ports, use getInterfaceList()
dutPorts = [str(l.getId()) for l in dut.getContainer().getInterfaceList()
if isinstance(l, org.zamia.instgraph.IGObject) and l.getCat() == IGObject.IGObjectCat.SIGNAL]
printf("DUT ports are: %s", ','.join(dutPorts))
To obtain the type of container (declared) item, assuming that toplevel declares a RAM signal
for i in module.getContainer().findLocalItems("RAM"):
printf ("%s has type %s:%s", i, i.getType(), i.getType().getClass())
where getClass prints signal's type = IGTypeStatic, which is used to represent types in IG.
Given
entity RANGE_TEST is end entity;
architecture RTL of RANGE_TEST is
constant c1 : bit_vector(3 to 5) := "011";
signal s1 : bit_vector(4 to 6) := c1 and "111";
constant i: Integer := 1;
begin
end architecture;
tl = Toplevel(DMUID.parse("WORK.RANGE_TEST"), None)
module = project.getIGM().findModule(tl)
from org.zamia.instgraph.interpreter import IGInterpreterRuntimeEnv, IGInterpreterCode
for ci in module.getContainer().localItems():
loc = ci.computeSourceLocation();
t = ci.getType();
staticType = t.getIndexType() if t.isArray() else t.computeStaticType(IGInterpreterRuntimeEnv(None, project), None, None);
high = staticType.getStaticHigh(loc);
low = staticType.getStaticLow(loc);
ascending = staticType.getStaticAscending(loc);
printf("%s static type is %s(%s), %s %s %s", ci, staticType, staticType.getClass().getSimpleName(), low, ascending, high);
prints
CONSTANT C1 : ARRAY 3 to 5 OF BIT static type is 3 to 5(IGTypeStatic), 3 TRUE 5
SIGNAL S1 : ARRAY 4 to 6 OF BIT static type is 4 to 6(IGTypeStatic), 4 TRUE 6
CONSTANT I : INTEGER static type is INTEGER(IGTypeStatic), -2147483648 TRUE 2147483647
For expression evaluation computeStaticValue can be used. For instance, to obtain initial values of
entity LEFT is end entity;
architecture Arch of LEFT is
signal b1: boolean;
constant b2: bit := bit'left;
constant i1: integer := 1 + 1;
begin
end architecture;
initial values can be obtained with script
from org.zamia.instgraph.interpreter import IGInterpreterRuntimeEnv, IGInterpreterCode
from org.zamia.vhdl.ast.VHDLNode.ASTErrorMode import EXCEPTION
tl = Toplevel(DMUID.parse("WORK.LEFT"), None)
module = project.getIGM().findModule(tl)
#signal = module.getContainer().getInterfaceList()
b1 = module.getContainer().resolveObject("B1")
iv = b1.getInitialValue()
printf("%s: %s := %s ", b1.getId(), b1.getType(), iv)
location = b1.computeSourceLocation()
ic = IGInterpreterCode("Getting initial value", location)
printf("ic = %s", ic)
env = IGInterpreterRuntimeEnv(ic, project)
printf("env = %s", env)
for obj in module.getContainer().localItems():
iv = obj.getInitialValue() # value is expression actually to be evaluated
if iv != None: # initial value is defined
#1: evaluating the iv expression
iv = " expression %s\n evaluated to %s" % (iv, iv.computeStaticValue(env, EXCEPTION, None))
else: # init value is undefined -- getting default (left) value
t = obj.getType().computeStaticType(env, EXCEPTION, None )
#The core of getting left value. It was misnomered 'generateZ'
left = org.zamia.instgraph.IGStaticValue.generateZ(t.computeStaticType(env, EXCEPTION, None), location);
iv = "unspecified, taking %s'left = %s" % (t, left) # must be false
printf("%s: %s := %s ", obj.getId(), obj.getType(), iv)
which prints
B1: BOOLEAN := unspecified, taking BOOLEAN'left = FALSE
B2: BIT := expression BIT'LEFT evaluated to 0
I1: INTEGER := expression "+"(IGMapping(formal=IGOperationObject(a), actual=1), IGMapping(formal=IGOperationObject(b), actual=1)) evaluated to 2
Assuming you have VHDL instantiation
U8 : entity CLASS.NR2 port map( A => n6, B => n7, Z => y(9));
in C17_VEC toplevel, the following
import org.zamia.instgraph.IGOperationIndex
tl = Toplevel(DMUID.parse("WORK." + "C17_VEC"), None)
module = project.getIGM().findModule(tl)
u8smt = module.findChild("U8")
printf("top=%s, DUT_GATES = %s", module, u8smt)
u8module = project.getIGM().findModule(u8smt.getSignature())
for i in range(0, u8smt.getNumMappings()):
def id(igOpObject):
if isinstance(igOpObject, org.zamia.instgraph.IGOperationIndex):
#printf("igobject " + igOpObject.getOperand().getObject().getId() + "(" + str(igOpObject.getIndex()) + ")")
return igOpObject.getOperand().getObject().getId() + "(" + str(igOpObject.getIndex()) + ")"
return igOpObject.getObject().getId()
m = u8smt.getMapping(i) ;
formal = id(m.getFormal()) ; actual = id(m.getActual());
printf ("formal %s => actual %s", formal, actual)
prints U8 port mapping
formal A => actual N6
formal B => actual N7
formal Z => actual Y(9)