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 - Bug #7690 (Closed): Exception handler is not handled if it is not the first element i...https://forge.ispras.ru/issues/76902016-11-08T12:29:38ZAndrei Tatarnikovandrewt@ispras.ru
<p>Subject. Investigation is required. See the code below. It is claimed that only <code>IntegerOverflow</code> is handled while others are not found.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">exception_handler</span> <span class="p">{</span>
<span class="n">section</span><span class="p">(</span><span class="ss">:org</span> <span class="o">=></span> <span class="mh">0x380</span><span class="p">,</span> <span class="ss">:exception</span> <span class="o">=></span> <span class="p">[</span><span class="s1">'IntegerOverflow'</span><span class="p">,</span> <span class="s1">'SystemCall'</span><span class="p">,</span> <span class="s1">'Breakpoint'</span><span class="p">])</span> <span class="p">{</span>
<span class="n">trace</span> <span class="s1">'Exception handler (EPC = 0x%x)'</span><span class="p">,</span> <span class="n">location</span><span class="p">(</span><span class="s1">'COP0_R'</span><span class="p">,</span> <span class="mi">14</span><span class="p">)</span>
<span class="n">mfc0</span> <span class="n">ra</span><span class="p">,</span> <span class="n">rcop0</span><span class="p">(</span><span class="mi">14</span><span class="p">)</span>
<span class="n">addi</span> <span class="n">ra</span><span class="p">,</span> <span class="n">ra</span><span class="p">,</span> <span class="mi">4</span>
<span class="n">jr</span> <span class="n">ra</span>
<span class="n">nop</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre> 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 #7628 (Closed): Methods 'dist' and 'range' are not supported in data sectionshttps://forge.ispras.ru/issues/76282016-10-25T10:57:22ZAndrei Tatarnikovandrewt@ispras.ru
<p>Subject. The code below gives error: <code>(MTRubyError) Method 'range' is not available in data sections</code>.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">data</span> <span class="p">{</span>
<span class="n">int32_dist</span> <span class="o">=</span> <span class="n">dist</span><span class="p">(</span><span class="n">range</span><span class="p">(</span><span class="ss">:value</span> <span class="o">=></span> <span class="mi">0</span><span class="p">,</span> <span class="ss">:bias</span> <span class="o">=></span> <span class="mi">25</span><span class="p">),</span>
<span class="n">range</span><span class="p">(</span><span class="ss">:value</span> <span class="o">=></span> <span class="mi">1</span><span class="o">..</span><span class="mi">2</span><span class="p">,</span> <span class="ss">:bias</span> <span class="o">=></span> <span class="mi">25</span><span class="p">),</span>
<span class="n">range</span><span class="p">(</span><span class="ss">:value</span> <span class="o">=></span> <span class="mh">0xffffFFFE</span><span class="o">..</span><span class="mh">0xffffFFFF</span><span class="p">,</span> <span class="ss">:bias</span> <span class="o">=></span> <span class="mi">50</span><span class="p">))</span>
<span class="n">word</span> <span class="n">int32_dist</span><span class="p">.</span><span class="nf">next_value</span><span class="p">,</span>
<span class="n">int32_dist</span><span class="p">.</span><span class="nf">next_value</span><span class="p">,</span>
<span class="n">int32_dist</span><span class="p">.</span><span class="nf">next_value</span>
<span class="p">}</span>
</code></pre>
<p>It must be supported.</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 - Task #7534 (Closed): Configuration option to manage reservation of explicitly specifi...https://forge.ispras.ru/issues/75342016-08-26T12:23:33ZAndrei Tatarnikovandrewt@ispras.ru
<p>It should be a possibility to inform the generator not to reserve registers specified explicitly. E.g.,</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">mov</span> <span class="n">reg</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="o">...</span> <span class="n">reg</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1"># is not marked as busy</span>
<span class="n">mov</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">),</span> <span class="o">...</span> <span class="c1"># an allocated register is marked as busy</span>
</code></pre>
<p>Configuration option: <code>--reserve-explicit-registers</code>.</p> MicroTESK - Bug #7463 (Closed): Correct processing of block structures and code in the root of pr...https://forge.ispras.ru/issues/74632016-08-12T10:29:30ZAndrei Tatarnikovandrewt@ispras.ru
<p>Currently, block sections and code placed outside of blocks (so-called external or global) are not handled correctly. The incorrect behavior includes unexpected exceptions, undesired split of code into parts processed separately, and wrong order of processing.</p>
<p>Here are basic requirements for the correct behavior:</p>
<ol>
<li>A block-like construct <em>must not</em> split global code into parts being processed separately, if the block is not run.</li>
<li>If a block saved into a variable is run, global code before the point of call gets processed.</li>
<li>Since it is not allowed to run blocks in the <code>pre</code> and <code>post</code> methods, program-level prologue and epilogue are always processed as a whole.</li>
</ol>
<p>Here is in example with comments:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">BlockGlobalCodeTemplate</span> <span class="o"><</span> <span class="no">MiniMipsBaseTemplate</span>
<span class="k">def</span> <span class="nf">pre</span>
<span class="k">super</span>
<span class="c1"># A: part of program prologue</span>
<span class="n">add</span> <span class="n">s0</span><span class="p">,</span> <span class="n">s0</span><span class="p">,</span> <span class="n">s0</span>
<span class="c1"># B: sequence block saved in an object-level variable</span>
<span class="vi">@z</span> <span class="o">=</span> <span class="n">sequence</span> <span class="p">{</span>
<span class="nb">sub</span> <span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">,</span> <span class="n">t3</span>
<span class="nb">sub</span> <span class="n">t3</span><span class="p">,</span> <span class="n">t4</span><span class="p">,</span> <span class="n">t5</span>
<span class="p">}</span>
<span class="c1"># C: part of program prologue, must be processed with A as a whole</span>
<span class="nb">sub</span> <span class="n">s1</span><span class="p">,</span> <span class="n">s2</span><span class="p">,</span> <span class="n">s3</span>
<span class="c1"># X: Prologue to be added to all test cases produced by block constructs</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="c1"># Y: Epilogue to be added to all test cases produced by block constructs</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="k">end</span>
<span class="k">def</span> <span class="nf">run</span>
<span class="c1"># D: external code for linking test cases</span>
<span class="n">nop</span>
<span class="n">nop</span>
<span class="c1"># E: sequence block saved in a local variable</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">sequence</span> <span class="p">{</span>
<span class="n">add</span> <span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">,</span> <span class="n">t3</span>
<span class="n">add</span> <span class="n">t3</span><span class="p">,</span> <span class="n">t4</span><span class="p">,</span> <span class="n">t5</span>
<span class="p">}</span>
<span class="c1"># F: external code for linking test cases, must be processed as a whole with D</span>
<span class="n">nop</span>
<span class="n">nop</span>
<span class="c1"># Processing: first - D and F as a whole, then - E.</span>
<span class="n">x</span><span class="p">.</span><span class="nf">run</span>
<span class="c1"># G: external code for linking test cases</span>
<span class="n">nop</span>
<span class="n">nop</span>
<span class="c1"># H: sequence block saved in a local variable (is not processed) </span>
<span class="n">y</span> <span class="o">=</span> <span class="n">sequence</span> <span class="p">{</span>
<span class="n">add</span> <span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">,</span> <span class="n">t3</span>
<span class="n">add</span> <span class="n">t3</span><span class="p">,</span> <span class="n">t4</span><span class="p">,</span> <span class="n">t5</span>
<span class="p">}</span>
<span class="c1"># I: external code for linking test cases, must be processed as a whole with G</span>
<span class="n">nop</span>
<span class="n">nop</span>
<span class="c1"># Processing: first - G and I as a whole, then - B.</span>
<span class="vi">@z</span><span class="p">.</span><span class="nf">run</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<p>The expected order of processing is the following:</p>
<ol>
<li>A and B as a whole</li>
<li>D and F as a whole</li>
<li>E (wrapped with X and Y)</li>
<li>G and I as a whole</li>
<li>B (wrapped with X and Y)</li>
</ol>
<p>H is not processed (reported as a warning).</p> 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> 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>