Task #5756
closedEFSM pre-initial state + initialization action
100%
Description
- Try to construct initialization action that contains assignments to default values (if they're exist in HDL). If failed, print warning message.
- Construct
false
pre-inital state & add it to the EFSM model. - Link pre-initial state with appropriate target (initial state) by initialization transition with
true
guard and initialization action. - Try to find RESET signal by already implemented heuristic.
- Store the pre-initial state data.
Updated by Sergey Smolov almost 10 years ago
- Category changed from 81 to Engine (Transformer)
Updated by Sergey Smolov almost 10 years ago
- Subject changed from EFSM pre-inital state + initialization action to EFSM pre-initial state + initialization action
Updated by Sergey Smolov almost 10 years ago
- Status changed from New to Open
- % Done changed from 0 to 30
2,3,4 - done.
Work on 1 is in progress (I've sent an email to Zamia team with a question about variables initialization). So today initialization action is empty.
Updated by Sergey Smolov almost 10 years ago
As for the initial values of variables, the answer from Zamia team is:
Начальное значение хранится в IGObject getInitialValue. Но проблема в том что это может быть выражение. То есть его ещё вычислить надо и оно имеет тип IGOperation. То есть его видимо можно просканировать на предмет IGObjectoв. А чтобы вычислить, надо симулятор запускать.
Проблема Замии как мне кажется в том что тут не хранятся обратные ссылки. IG модули знают о своих дочерних объектах, а вот дочки, в отличае от AST дерева, на родителя не факт что ссылаются. На декларацию они ссылаются, а декларации на контейнер нет. Поэтому мы последний раз строили базу данных: пробегали вначале всю структуру (это был netlist: только сигналы и IGInstances -- никаких процессов) и запоминали какие порты гейтов связаны с какими сигналами. Потом уже быстро получалось отображать сигнал на модуль. Тут по-видимому тоже надо нечто подобное делать: пробежать IG-иерархию, типа что IGStructureVisitor делает и создать базу данных -- простое отображение IGObject на родительский IGScope (IGProcess, IGModule и IGStructure реализуют Scope интерфейс). Но это труд и очень большая похоже. Логичнее было бы всё это прямо в Замии реализовать, а может быть и легче на порядок. Но я не решился. Побоялся что дополнительные данные в DB несколько снизят её производительность и главное: создание новых связей требуется связываться со страшной ZamiaDB, а у меня против неё предубеждения.
Updated by Sergey Smolov almost 10 years ago
More info about default values in VHDL:
Сори, вот так это делается. Если вязть исходник 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; В нём задекларировано три объекта (сигналы и константы). Причём у первого не задано начальное значение. Выяснить это можно нехитрым кодом (питон в данном случае) 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 = a.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) Питон берёт контейнер модуля, который содержит все декларации переменных. Если начальное выражение obj.getInitialValue задано, то iv.computeStaticValue(env, EXCEPTION, None)) просто вычисляет его. Иначе, нужно получить статический тип объекта и функция generateZ возвратит левое значение по умолчанию. Она по-ошибке названа generateZ, хотя предназначена не для z-значений, а как раз для левых значений по умолчанию в VHDL.
Updated by Sergey Smolov over 9 years ago
- Status changed from Open to Resolved
- % Done changed from 30 to 100
The scheme was modified and resolved.
r2021 (trunk).
Updated by Sergey Smolov over 9 years ago
- Status changed from Resolved to Verified
Updated by Sergey Smolov over 9 years ago
- Status changed from Verified to Closed
- Published in build set to 20150701