lapinuelle / PetriLogicSimulatorProject

Logic simulator based on Petri Nets Algorithm
0 stars 0 forks source link

Неправильные имена в VCD при сохранении иерархии #13

Open TopGun-DICD opened 6 years ago

TopGun-DICD commented 6 years ago

Криво сохраняются в VCD имена узлов, вложенных по иерархии. Прикладываю два файла: один наш, один икаруса.

Надо допиливать код писателя VCD. trig_DFF_pls.txt trig_DFF_icarus.txt

lapinuelle commented 6 years ago

Предлагаю, чтобы каждый раз не искать реальное имя пина, завести в классе нетлиста map, в котором будут храниться пары <имя в иерархии, реальное имя>

А заполнять его как раз на этапе unwrap_module в читалке

lapinuelle commented 6 years ago

Исправлено

lapinuelle commented 6 years ago

Однако, нет. При моделировании сдвигового регистра выяснилось, что у двух инстанций триггера в VCD пишутся одинаковые имена портов. Возможно, это и не косяк вовсе, поскольку, может, внутренние пины инстанций и не стоит выводить. Но пока разморожу эту проблему

P.S. На работу симулятора никак не влияет

lapinuelle commented 6 years ago

Не посмотрел изначально файл икаруса, потому и не понял. Сейчас глянул, увидел, как разбиваются группы пинов по модулям. И это круто. Надо так же сделать

TopGun-DICD commented 6 years ago

Круто, конечно, но при нашем нынешнем подходе к организации читалки так сделать сложно. Когда я разворачиваю иерархию, я имена пинов вложенных модулей заменяю на реальные пины вышестоящего модуля. То есть в триггере имена D, C !заменяются! на имена пинов в тестбенче in_D, in_C. Информации о том, что в этом модуле были свои пины, больше нет. Надо думать, как это реализовать.

lapinuelle commented 6 years ago

Я когда пытался это пофиксить, завел у каждого пина параметр realName. Туда пишутся исходные имена пинов, которые были у них независимо от иерархии.

TopGun-DICD commented 6 years ago

Не в этом дело. Фишка в том, что icarus пишет и имя пина в рутовом модуле, и имя пина в иерархически вложенном модуле. Например. Есть tb_DFF, в нём есть in_D, in_C, и есть, собственно, сам DFF - там есть D и C. Икарус будет сохранять 4 пина - in_D, in_C, D и C. У нас же я при разворачивании иерархии заменяю имена пинов внутри модуля именами пинов в рутовой схеме (ведь в реальности так всё и есть: D - это реально in_D, С - это реально in_C). И информация об это теряется.

Если разбирать конкретно DFF, то икарус хранит пины так (относительно рута): in_D, in_C, out_Q, out_nQ, i1.D (реально это in_D), i1.C (реально это in_C), i1.Q (реально это out_Q), i1.nQ (реально это out_nQ), i1.net1, i1.net2, i1.net3, i1.net4, i1.net5, i1.net6

Мы же храним так: in_D, in_C, out_Q, out_nQ, i1.net1, i1.net2, i1.net3, i1.net4, i1.net5, i1.net6

То есть заменённые i1.D, i1.C, i1.Q, i1.nQ (заменённые на рутовые имена пинов) мы не храним, информация о них у нас сейчас теряется. Если не понятно, мне проще лично объяснить :-)

TopGun-DICD commented 6 years ago

Вынести формирование имён для VCD файла из симулятора в читалку

TopGun-DICD commented 6 years ago

(Это просто мне напоминалка) При выводе имён файлов нужно писать их с учётом полного пути в иерархии, в противном случае возникает $DUP0 из-за того, что одинаковые имена нетов дублируются в разных инстансах:

$scope module logic $end $var wire 1 ! C $end $var wire 1 " D $end $var wire 1 # Q1 $end $var wire 1 $ Q2 $end $var wire 1 % net0 $end $var wire 1 & net1 $end $var wire 1 ' net2 $end $var wire 1 ( net3 $end $var wire 1 ) net4 $end $var wire 1 * net5 $end $var wire 1 + net6 $end $var wire 1 , net0 $end $var wire 1 - net1 $end $var wire 1 . net2 $end $var wire 1 / net3 $end $var wire 1 0 net4 $end $var wire 1 1 net5 $end $var wire 1 2 net6 $end $var wire 1 3 nQ1 $end $var wire 1 4 nQ2 $end $upscope $end