Open-Source Projects: Issueshttps://forge.ispras.ru/https://forge.ispras.ru/favicon.ico?16490126692017-10-05T07:38:41ZOpen-Source Projects
Redmine 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> 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 - 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 #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 #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> 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 - Bug #5708 (Closed): MicroTESK build fails: SsaAssembler - symbol Changes is not definedhttps://forge.ispras.ru/issues/57082015-03-13T11:06:24ZAndrei Tatarnikovandrewt@ispras.ru
<p>Artem, please add the Changes class to the SVN source code base. Now the build fails:</p>
<pre>
javac.core:
[mkdir] Created dir: /srv/hudson/jobs/MicroTESK/workspace/bin/microtesk
[javac] Compiling 272 source files to /srv/hudson/jobs/MicroTESK/workspace/bin/microtesk
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:42: error: cannot find symbol
[javac] Deque<Changes> changesStack;
[javac] ^
[javac] symbol: class Changes
[javac] location: class SsaAssembler
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:43: error: cannot find symbol
[javac] Changes changes;
[javac] ^
[javac] symbol: class Changes
[javac] location: class SsaAssembler
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:169: error: cannot find symbol
[javac] private static void join(Changes repo, Collection<GuardedBlock> blocks, Collection<Changes> containers, NodeTransformer xform) {
[javac] ^
[javac] symbol: class Changes
[javac] location: class SsaAssembler
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:169: error: cannot find symbol
[javac] private static void join(Changes repo, Collection<GuardedBlock> blocks, Collection<Changes> containers, NodeTransformer xform) {
[javac] ^
[javac] symbol: class Changes
[javac] location: class SsaAssembler
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:185: error: cannot find symbol
[javac] private static Node getJointFallback(String name, Changes master, Changes branch) {
[javac] ^
[javac] symbol: class Changes
[javac] location: class SsaAssembler
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:185: error: cannot find symbol
[javac] private static Node getJointFallback(String name, Changes master, Changes branch) {
[javac] ^
[javac] symbol: class Changes
[javac] location: class SsaAssembler
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:62: error: unexpected type
[javac] this.changesStack = new ArrayDeque<>();
[javac] ^
[javac] required: class
[javac] found: <E>ArrayDeque<E>
[javac] where E is a type-variable:
[javac] E extends Object declared in class ArrayDeque
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:65: error: cannot find symbol
[javac] this.changes = new Changes(changesStore, changesStore);
[javac] ^
[javac] symbol: class Changes
[javac] location: class SsaAssembler
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:130: error: cannot find symbol
[javac] final Collection<Changes> containers = changes.fork(size);
[javac] ^
[javac] symbol: class Changes
[javac] location: class SsaAssembler
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:131: error: cannot find symbol
[javac] final Iterator<Changes> rebasers = containers.iterator();
[javac] ^
[javac] symbol: class Changes
[javac] location: class SsaAssembler
[javac] /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java:172: error: cannot find symbol
[javac] for (Changes diff : containers) {
[javac] ^
[javac] symbol: class Changes
[javac] location: class SsaAssembler
[javac] Note: /srv/hudson/jobs/MicroTESK/workspace/src/main/java/core/ru/ispras/microtesk/translator/simnml/coverage/ssa/SsaAssembler.java uses unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.
[javac] 11 errors
BUILD FAILED
/srv/hudson/jobs/MicroTESK/workspace/build.xml:217: Compile failed; see the compiler error output for details.
Total time: 18 seconds
[WARNINGS] Skipping publisher since build result is FAILURE
Recording test results
Finished: FAILURE
</pre> MicroTESK - Bug #5668 (Closed): Issues with large memory addresses (48 and 64 bits) must be fixedhttps://forge.ispras.ru/issues/56682015-03-03T07:50:50ZAndrei Tatarnikovandrewt@ispras.ru
<p>Subj. Top priority.</p>
<p>Basic test LargeAddrTestCase fails marking the current version as unstable.</p>
<p>Also, tests and examples (nML + test templates) are required.</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>