Open-Source Projects: Issueshttps://forge.ispras.ru/https://forge.ispras.ru/favicon.ico?16490126692018-06-09T11:26:06ZOpen-Source Projects
Redmine MicroTESK - Feature #8939 (Closed): [autogen] New option 'base-template-path' must be supported.https://forge.ispras.ru/issues/89392018-06-09T11:26:06ZAndrei Tatarnikovandrewt@ispras.ru
<p>A new option 'base-template-path' (<code>--base-template-path</code> or <code>-btp</code>) was established.<br />It specifies the path to the base template file.<br />This must be supported in Template Generator.</p> MicroTESK - Task #8481 (New): Need a way to specify the termination address for the test programhttps://forge.ispras.ru/issues/84812017-10-05T07:38:41ZAndrei Tatarnikovandrewt@ispras.ru
<p>When generation is finished MicroTESK checks whether the execution reaches the end of the program.<br />Currently, MicroTESK considers the end of the program to be the last instruction of the last sequence (e.g. the program's epilogue).<br />However, the end of epilogue might contain some supplementary code that does not necessarily executed last (handlers, termination for different PEs).<br />In such cases, MicroTESK mistakenly says that execution cannot reach the termination point. This causes generation to fail.</p>
<p>To avoid such situation, there must be a way to explicitly specify the termination point for each PE.<br />It can be a special pseudo instruction that marks the termination point or a way to specify the termination address for a PE.</p> MicroTESK - Bug #8060 (New): Attributes image and syntax and static instanceshttps://forge.ispras.ru/issues/80602017-04-13T10:48:57ZAndrei Tatarnikovandrewt@ispras.ru
<p>The following construct is illegal:<br /><pre>image = slt(rd, X(0), rs).image</pre><br />nML translator forces to write it like this:<br /><pre>image = format("%s", slt(rd, X(0), rs).image)</pre><br />This is inconvenient and redundant.</p>
<p>Constructs like in the first example must be supported.</p> TestBase - Bug #7759 (Closed): Avoid using lambda functionshttps://forge.ispras.ru/issues/77592016-11-28T13:25:42ZAndrei Tatarnikovandrewt@ispras.ru
<p>Использование lambda-функций (<a href="http://forge.ispras.ru/projects/testbase/repository/revisions/50f3ae809bbfc504fc7745eee8b626a5e7f4b019/entry/src/main/java/ru/ispras/testbase/storage/SQLiteStorage/db/dao/FormulaDAO.java" class="external">как здесь</a>) в реализации нежелательно. Они не поддерживаются в Java 1.7, которая сейчас используется для сборки всех проектов.</p> MicroTESK - Task #7678 (New): Generation of LLVM configuration files from nML specificationshttps://forge.ispras.ru/issues/76782016-11-04T08:41:14ZAndrei Tatarnikovandrewt@ispras.ru
<p>Subject. To solve this task, you need implement an extension in Java that will traverse nML IR and generated the required files.</p>
<p>Such extensions implement the <code>TranslatorHandler</code> interface and are registered in the constuctor of the <code>NmlTranslator</code> class (see the code fragment below).</p>
<pre><code class="java syntaxhl" data-language="java"><span class="kd">public</span> <span class="kd">final</span> <span class="kd">class</span> <span class="nc">NmlTranslator</span> <span class="kd">extends</span> <span class="nc">Translator</span><span class="o"><</span><span class="nc">Ir</span><span class="o">></span> <span class="o">{</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="nc">Set</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="no">FILTER</span> <span class="o">=</span> <span class="nc">Collections</span><span class="o">.</span><span class="na">singleton</span><span class="o">(</span><span class="s">".nml"</span><span class="o">);</span>
<span class="kd">public</span> <span class="nf">NmlTranslator</span><span class="o">()</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">(</span><span class="no">FILTER</span><span class="o">);</span>
<span class="n">getSymbols</span><span class="o">().</span><span class="na">defineReserved</span><span class="o">(</span><span class="nc">NmlSymbolKind</span><span class="o">.</span><span class="na">KEYWORD</span><span class="o">,</span> <span class="nc">ReservedKeywords</span><span class="o">.</span><span class="na">JAVA</span><span class="o">);</span>
<span class="n">getSymbols</span><span class="o">().</span><span class="na">defineReserved</span><span class="o">(</span><span class="nc">NmlSymbolKind</span><span class="o">.</span><span class="na">KEYWORD</span><span class="o">,</span> <span class="nc">ReservedKeywords</span><span class="o">.</span><span class="na">RUBY</span><span class="o">);</span>
<span class="c1">// Detects parent-child connections between primitives</span>
<span class="n">addHandler</span><span class="o">(</span><span class="k">new</span> <span class="nc">ReferenceDetector</span><span class="o">());</span>
<span class="c1">// Adds the list of root operations to IR </span>
<span class="n">addHandler</span><span class="o">(</span><span class="k">new</span> <span class="nc">RootDetector</span><span class="o">());</span>
<span class="n">addHandler</span><span class="o">(</span><span class="k">new</span> <span class="nc">ArgumentModeDetector</span><span class="o">());</span>
<span class="n">addHandler</span><span class="o">(</span><span class="k">new</span> <span class="nc">BranchDetector</span><span class="o">());</span>
<span class="n">addHandler</span><span class="o">(</span><span class="k">new</span> <span class="nc">MemoryAccessDetector</span><span class="o">());</span>
<span class="n">addHandler</span><span class="o">(</span><span class="k">new</span> <span class="nc">Analyzer</span><span class="o">(</span><span class="k">this</span><span class="o">));</span>
<span class="n">addHandler</span><span class="o">(</span><span class="k">new</span> <span class="nc">PrimitiveSyntesizer</span><span class="o">(</span><span class="k">this</span><span class="o">));</span>
<span class="n">addHandler</span><span class="o">(</span><span class="k">new</span> <span class="nc">ExceptionDetector</span><span class="o">());</span>
<span class="c1">// Generate Java code of the ISA model</span>
<span class="n">addHandler</span><span class="o">(</span><span class="k">new</span> <span class="nc">MetaDataGenerator</span><span class="o">(</span><span class="k">this</span><span class="o">));</span>
<span class="n">addHandler</span><span class="o">(</span><span class="k">new</span> <span class="nc">Generator</span><span class="o">(</span><span class="k">this</span><span class="o">));</span>
<span class="o">}</span>
</code></pre>
<p>All these handlers are examples of how to implement logic traversing IR. Some of them perform analysis and some generate code. Code generation is done using the <a href="http://www.stringtemplate.org/" class="external">StringTemplate</a> library (STG files + java classes).</p>
<p>To traverse the IR, the following classes and interfaces can be used: <code>IrVisitor</code>, <code>IrVisitorDefault</code> and <code>IrWalker</code> (or its variations <code>IrWalkerFlow</code>, <code>IrWalkerShortcuts</code>) defined in the <code>ru.ispras.microtesk.translator.nml.ir</code> package. You need to implement <code>IrVisitor</code> (use <code>IrVisitorDefault</code> as default implementation with empty methods) and pass it to the most suitable walker. <em>NOTE: implementation of IR walker and visitor is raw and a subject to improvements. Any questions/feedback are appreciated.</em></p>
<p>Expressions require using a separate walker and visitor implemented in Fortress: <code>ExprTreeVisitor</code>, <code>ExprTreeVisitorDefault</code> and <code>ExprTreeWalker</code> (<code>ru.ispras.fortress.expression</code>). Examples of using them you can find both in MicroTESK and in Fortress.</p> MicroTESK - Bug #7603 (New): List of plug-ins must be stored in etc/settings.xmlhttps://forge.ispras.ru/issues/76032016-10-11T15:49:53ZAndrei Tatarnikovandrewt@ispras.ru
<p>List of MicroTESK plugins is stored in config.xml included in JAR's resources. As a result, it cannot be modified. The format of config.xml looks like this:</p>
<pre>
<config>
<plugin class="ru.ispras.microtesk.mmu.MmuPlugin"/>
</config>
</pre>
<p>This information must be stored in etc/settings.xml.</p> MicroTESK - Bug #7461 (Closed): Block-level prologue and epilogue must stay prologue and epilogue...https://forge.ispras.ru/issues/74612016-08-11T14:14:15ZAndrei Tatarnikovandrewt@ispras.ru
<p>Block-level prologue and epilogue are destroyed when blocks are merged by a wrapping block.</p>
<p>First of all, they must remain atomic even if there is a muti-level nesting that does complex blending. Second, they must be always attached to the top and to the bottom of the sequence respectively. This will unsure that they will do proper initialization and finalization for sequences when they are mixed. This is needed to be able to mix self-contained sequences that required initialization and finalization.</p>
<p>E.g. the correct result of the code below must be as follows (now it gives a random mix):</p>
<pre>
// Global prologue starts
// Global prologue ends
// Root block prologue starts
// Root block prologue ends
// Sequence 1 prologue starts
// Sequence 1 prologue ends
// Sequence 2 prologue starts
// Sequence 2 prologue ends
and $4, $2, $15
sub $2, $15, $4
or $14, $14, $4
add $4, $22, $14
// Sequence 1 epilogue starts
// Sequence 1 epilogue ends
// Sequence 2 epilogue starts
// Sequence 2 epilogue ends
// Root block epilogue starts
// Root block epilogue ends
// Global epilogue starts
// Global epilogue ends
</pre>
<p>Template code:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">PrologueEpilogueTemplate</span> <span class="o"><</span> <span class="no">MiniMipsBaseTemplate</span>
<span class="k">def</span> <span class="nf">run</span>
<span class="n">prologue</span> <span class="p">{</span>
<span class="n">pseudo</span> <span class="s1">'// Global prologue starts'</span>
<span class="n">pseudo</span> <span class="s1">'// Global prologue ends'</span>
<span class="p">}</span>
<span class="n">epilogue</span> <span class="p">{</span>
<span class="n">pseudo</span> <span class="s1">'// Global epilogue starts'</span>
<span class="n">pseudo</span> <span class="s1">'// Global epilogue ends'</span>
<span class="p">}</span>
<span class="n">block</span><span class="p">(</span><span class="ss">combinator: </span><span class="s1">'diagonal'</span><span class="p">,</span> <span class="ss">compositor: </span><span class="s1">'catenation'</span><span class="p">,</span> <span class="ss">obfuscator: </span><span class="s1">'random'</span><span class="p">)</span> <span class="p">{</span>
<span class="n">prologue</span> <span class="p">{</span>
<span class="n">pseudo</span> <span class="s1">'// Root block prologue starts'</span>
<span class="n">pseudo</span> <span class="s1">'// Root block prologue ends'</span>
<span class="p">}</span>
<span class="n">sequence</span> <span class="p">{</span>
<span class="n">prologue</span> <span class="p">{</span>
<span class="n">pseudo</span> <span class="s1">'// Sequence 1 prologue starts'</span>
<span class="n">pseudo</span> <span class="s1">'// Sequence 1 prologue ends'</span>
<span class="p">}</span>
<span class="n">add</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">),</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">),</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">)</span>
<span class="nb">sub</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">),</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">),</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">)</span>
<span class="n">epilogue</span> <span class="p">{</span>
<span class="n">pseudo</span> <span class="s1">'// Sequence 1 epilogue starts'</span>
<span class="n">pseudo</span> <span class="s1">'// Sequence 1 epilogue ends'</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">sequence</span> <span class="p">{</span>
<span class="n">prologue</span> <span class="p">{</span>
<span class="n">pseudo</span> <span class="s1">'// Sequence 2 prologue starts'</span>
<span class="n">pseudo</span> <span class="s1">'// Sequence 2 prologue ends'</span>
<span class="p">}</span>
<span class="no">And</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">),</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">),</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">)</span>
<span class="no">Or</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">),</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">),</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">)</span>
<span class="n">epilogue</span> <span class="p">{</span>
<span class="n">pseudo</span> <span class="s1">'// Sequence 2 epilogue starts'</span>
<span class="n">pseudo</span> <span class="s1">'// Sequence 2 epilogue ends'</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">epilogue</span> <span class="p">{</span>
<span class="n">pseudo</span> <span class="s1">'// Root block epilogue starts'</span>
<span class="n">pseudo</span> <span class="s1">'// Root block epilogue ends'</span>
<span class="p">}</span>
<span class="p">}.</span><span class="nf">run</span> <span class="mi">10</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre> MicroTESK - Bug #6911 (New): The "get_address_of" method must work with all label types.https://forge.ispras.ru/issues/69112016-03-01T08:49:06ZAndrei Tatarnikovandrewt@ispras.ru
<p>Currently, it is limited to labels defined in global data sections. It must support all kinds of label. It should return a lazy value instead of a constant.</p> MicroTESK - Bug #6380 (New): Possibility to specify initial values for registershttps://forge.ispras.ru/issues/63802015-10-29T12:24:31ZAndrei Tatarnikovandrewt@ispras.ru
<p>Possibility to specify initial values for registers must be provided in nML:</p>
<pre>reg R[1, card(32)] initial = 100</pre> MicroTESK - Bug #5990 (New): Memory state must be taken into account when generating test datahttps://forge.ispras.ru/issues/59902015-05-27T08:46:50ZAndrei Tatarnikovandrewt@ispras.ru
<p>Data defined in <code>data{...}</code> blocks (global data) must be taken into account when generating test data.<br />Now the test data generator does not see data placed into memory outside of the current test template block.</p> Fortress - Task #5819 (Closed): Calculator for bit vectorshttps://forge.ispras.ru/issues/58192015-04-09T13:18:19ZAndrei Tatarnikovandrewt@ispras.ru
<p>Subj. must be implemented.</p> Fortress - Bug #5775 (Closed): BitVector.longValue returns incorrect valueshttps://forge.ispras.ru/issues/57752015-03-27T09:00:32ZAndrei Tatarnikovandrewt@ispras.ru
<p>Subject. The code blow fails:</p>
<pre><code class="java syntaxhl" data-language="java"><span class="kd">final</span> <span class="nc">BitVector</span> <span class="n">bv1</span> <span class="o">=</span> <span class="nc">BitVector</span><span class="o">.</span><span class="na">valueOf</span><span class="o">(</span><span class="mh">0x00000000000A0000</span><span class="no">L</span><span class="o">,</span> <span class="mi">64</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">bv1</span><span class="o">.</span><span class="na">toHexString</span><span class="o">());</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="nc">Long</span><span class="o">.</span><span class="na">toHexString</span><span class="o">(</span><span class="n">bv1</span><span class="o">.</span><span class="na">longValue</span><span class="o">()));</span>
<span class="n">assertEquals</span><span class="o">(</span><span class="mh">0x00000000000A0000</span><span class="no">L</span><span class="o">,</span> <span class="n">bv1</span><span class="o">.</span><span class="na">longValue</span><span class="o">());</span>
<span class="kd">final</span> <span class="nc">BitVector</span> <span class="n">bv2</span> <span class="o">=</span> <span class="nc">BitVector</span><span class="o">.</span><span class="na">valueOf</span><span class="o">(</span><span class="mh">0xFFFFFFFFFFF5FFFF</span><span class="no">L</span><span class="o">,</span> <span class="mi">64</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">bv2</span><span class="o">.</span><span class="na">toHexString</span><span class="o">());</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="nc">Long</span><span class="o">.</span><span class="na">toHexString</span><span class="o">(</span><span class="n">bv2</span><span class="o">.</span><span class="na">longValue</span><span class="o">()));</span>
<span class="n">assertEquals</span><span class="o">(</span><span class="mh">0xFFFFFFFFFFF5FFFF</span><span class="no">L</span><span class="o">,</span> <span class="n">bv2</span><span class="o">.</span><span class="na">longValue</span><span class="o">());</span>
<span class="kd">final</span> <span class="nc">BitVector</span> <span class="n">bv3</span> <span class="o">=</span> <span class="nc">BitVector</span><span class="o">.</span><span class="na">valueOf</span><span class="o">(</span><span class="mh">0xDEADBEEFBAADF00D</span><span class="no">L</span><span class="o">,</span> <span class="mi">64</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">bv3</span><span class="o">.</span><span class="na">toHexString</span><span class="o">());</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="nc">Long</span><span class="o">.</span><span class="na">toHexString</span><span class="o">(</span><span class="n">bv3</span><span class="o">.</span><span class="na">longValue</span><span class="o">()));</span>
<span class="n">assertEquals</span><span class="o">(</span><span class="mh">0xDEADBEEFBAADF00D</span><span class="no">L</span><span class="o">,</span> <span class="n">bv3</span><span class="o">.</span><span class="na">longValue</span><span class="o">());</span>
</code></pre> MicroTESK - Task #5657 (Closed): A command line option for random seedhttps://forge.ispras.ru/issues/56572015-02-25T12:09:04ZAndrei Tatarnikovandrewt@ispras.ru
<p>Need a possibility to specify random seed (Task <a class="issue tracker-2 status-5 priority-6 priority-high2 closed" title="Task: [template] User-defined seed for random generation (Closed)" href="https://forge.ispras.ru/issues/5654">#5654</a>) as a command line argument.</p> MicroTESK - Task #5192 (New): Assert constructions to check the model state during and after simu...https://forge.ispras.ru/issues/51922014-08-12T08:43:23ZAndrei Tatarnikovandrewt@ispras.ru
<p>Необходимо реализовать конструкции assert для тестовых шаблонов. Это внутренняя фича для нас, а не для пользователя. Assert'ами будем проверять внутреннее состояние модели во время симуляции символической тестовой программы и после (во время генерации кода тестовой программы). Это нужно для тестирования работы симулятора. Можно будет включить в автоматическую сборку генерацию тестовых программ для всех примеров тестовых шаблонов - будут регрессионные тесты.</p> MicroTESK - Task #4061 (New): Support for endiannesshttps://forge.ispras.ru/issues/40612013-04-03T09:36:03ZAndrei Tatarnikovandrewt@ispras.ru
<p>Сейчас порядок байт не учитывается при моделировании. Он принимается за little-endian по умолчанию.</p>
<p>В моделях, предоставленных IIT Kanpur порядок байт задаётся ключом byte_order. Это выглядит так:</p>
<p>let byte_order = "little" <br />let byte_order = "big"</p>
<p>Нам тоже нужно учитывать порядок байт при моделировании модели.</p>