Open-Source Projects: Issueshttps://forge.ispras.ru/https://forge.ispras.ru/favicon.ico?16490126692017-09-23T13:32:46ZOpen-Source Projects
Redmine MicroTESK - Bug #8455 (Rejected): Test Documenthttps://forge.ispras.ru/issues/84552017-09-23T13:32:46ZAndrei Tatarnikovandrewt@ispras.ru
<p>test</p> MicroTESK - Bug #8061 (Rejected): Position of all blocks, calls, data etc. in test templates must...https://forge.ispras.ru/issues/80612017-04-13T13:05:14ZAndrei Tatarnikovandrewt@ispras.ru
<p>subject</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 - 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 - 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 #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 #7418 (Closed): Reset the state of the model before starting generating a new tes...https://forge.ispras.ru/issues/74182016-07-22T13:16:48ZAndrei Tatarnikovandrewt@ispras.ru
<p>When MicroTESK processes a test template, it may place the generated test cases into multiple files.<br />When generation of a new file starts, MicroTESK must reset the state of the model (registers and memory including all MMU buffers).</p> MicroTESK - Bug #7385 (Closed): The 'prepare' function does not work with randomly selected regis...https://forge.ispras.ru/issues/73852016-07-11T12:26:17ZAndrei Tatarnikovandrewt@ispras.ru
<p>Code like this:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">prepare</span> <span class="n">reg</span><span class="p">(</span><span class="n">_</span><span class="p">),</span> <span class="mh">0xDEADBEEF</span>
</pre></code>
<p>leads to the following error:</p>
<pre>
Preparator invocation: REG = 0xdeadbeef
********************************************************************************
ATTENTION! An unexpected error has occurred:
java.lang.IllegalStateException: Value is not set.
The program will be terminated. Please contact us at:
microtesk-support@ispras.ru
We are sorry for the inconvenience.
Exception stack:
java.lang.IllegalStateException: Value is not set.
at ru.ispras.microtesk.test.template.UnknownImmediateValue.getValue(ru/ispras/microtesk/test/template/UnknownImmediateValue.java:111)
at ru.ispras.microtesk.test.template.Argument.getImmediateValue(ru/ispras/microtesk/test/template/Argument.java:119)
at ru.ispras.microtesk.test.template.Preparator.isMatch(ru/ispras/microtesk/test/template/Preparator.java:140)
at ru.ispras.microtesk.test.template.PreparatorStore.getPreparator(ru/ispras/microtesk/test/template/PreparatorStore.java:124)
at ru.ispras.microtesk.test.template.PreparatorStore.getPreparator(ru/ispras/microtesk/test/template/PreparatorStore.java:83)
at ru.ispras.microtesk.test.template.Template.addPreparatorCall(ru/ispras/microtesk/test/template/Template.java:633)
at java.lang.reflect.Method.invoke(java/lang/reflect/Method.java:606)
at RUBY.prepare(/home/andrewt/Documents/ISPRAS/src/microtesk/trunk/microtesk/dist/lib/ruby/template.rb:662)
at RUBY.run(/home/andrewt/Documents/ISPRAS/src/microtesk/trunk/microtesk/dist/arch/minimips/templates/euclid.rb:34)
at RUBY.generate(/home/andrewt/Documents/ISPRAS/src/microtesk/trunk/microtesk/dist/lib/ruby/template.rb:961)
at RUBY.main(/home/andrewt/Documents/ISPRAS/src/microtesk/trunk/microtesk/dist/lib/ruby/microtesk.rb:35)
at org.jruby.RubyHash.each(org/jruby/RubyHash.java:1342)
at RUBY.main(/home/andrewt/Documents/ISPRAS/src/microtesk/trunk/microtesk/dist/lib/ruby/microtesk.rb:31)
at RUBY.(root)(/home/andrewt/Documents/ISPRAS/src/microtesk/trunk/microtesk/dist/lib/ruby/microtesk.rb:54)
at ru.ispras.microtesk.test.TestEngine.generate(ru/ispras/microtesk/test/TestEngine.java:153)
at ru.ispras.microtesk.MicroTESK.generate(ru/ispras/microtesk/MicroTESK.java:290)
at ru.ispras.microtesk.MicroTESK.main(ru/ispras/microtesk/MicroTESK.java:72)
</pre></pre> MicroTESK - Bug #7269 (Rejected): Returning from an exception in the last instruction in a test casehttps://forge.ispras.ru/issues/72692016-06-03T12:04:00ZAndrei Tatarnikovandrewt@ispras.ru
<p>Situation:</p>
<p>1. An exception handler jumps to the instruction that goes next after the instruction that caused the exception.<br />2. The instruction that caused the exception is last in the sequence.<br />3. MicroTESK fails:</p>
<pre>
Generation Aborted
Error: Simulation error. There is no executable code at 0xffffffffa0002260
</pre>
<p>Such situation must be handled and MicroTESK should correctly stop execution.</p> MicroTESK - Bug #7251 (Rejected): A warning or error is needed when a value is truncatedhttps://forge.ispras.ru/issues/72512016-05-25T10:30:24ZAndrei Tatarnikovandrewt@ispras.ru
<p>Constant expressions are cast to nML types depending of the context. For example, in expressions of kind "<code>VARIABLE operator CONSTANT</code>", CONSTANT is cast to the type of VARIABLE. If CONSTANT is larger than can be represented by the type, its higher bits are truncated. This can lead to unexpected results. For this reason, in such situations a warning or an error must be generated.</p>
<p>Example:</p>
<code>In "x + 32" where x has type card(5), 32 gets truncated to 0.</code> 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 #6910 (Closed): The is_global flag for data sectionshttps://forge.ispras.ru/issues/69102016-03-01T08:45:34ZAndrei Tatarnikovandrewt@ispras.ru
<p>It should be possible to treat data defined inside of blocks, which are normally treated as test case data, as global data. This is important for code libraries.</p>