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 over 9 years ago
- Category changed from 81 to Engine (Transformer)
Updated by Sergey Smolov over 9 years ago
- Subject changed from EFSM pre-inital state + initialization action to EFSM pre-initial state + initialization action
Updated by Sergey Smolov over 9 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 over 9 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 over 9 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