improved the barrel shifter

This commit is contained in:
hneemann 2019-07-13 09:28:22 +02:00
parent 058824530c
commit e152fbbef1
15 changed files with 189 additions and 140 deletions

View File

@ -371,12 +371,100 @@ end loop</dataString>
</elementAttributes>
<pos x="580" y="1020"/>
</visualElement>
<visualElement>
<elementName>Out</elementName>
<elementAttributes>
<entry>
<string>Label</string>
<string>D^64</string>
</entry>
<entry>
<string>Bits</string>
<int>64</int>
</entry>
<entry>
<string>intFormat</string>
<intFormat>bin</intFormat>
</entry>
</elementAttributes>
<pos x="740" y="-120"/>
</visualElement>
<visualElement>
<elementName>In</elementName>
<elementAttributes>
<entry>
<string>Label</string>
<string>D^64_in</string>
</entry>
<entry>
<string>Bits</string>
<int>64</int>
</entry>
<entry>
<string>intFormat</string>
<intFormat>bin</intFormat>
</entry>
<entry>
<string>InDefault</string>
<value v="1" z="false"/>
</entry>
</elementAttributes>
<pos x="160" y="-140"/>
</visualElement>
<visualElement>
<elementName>In</elementName>
<elementAttributes>
<entry>
<string>Label</string>
<string>sh^64</string>
</entry>
<entry>
<string>Bits</string>
<int>6</int>
</entry>
</elementAttributes>
<pos x="380" y="-100"/>
</visualElement>
<visualElement>
<elementName>barrelShifter.dig</elementName>
<elementAttributes>
<entry>
<string>Label</string>
<string>64 bit, left</string>
</entry>
<entry>
<string>generic</string>
<string>dataBits := 64;
direction := &quot;left&quot;;</string>
</entry>
</elementAttributes>
<pos x="420" y="-140"/>
</visualElement>
<visualElement>
<elementName>Testcase</elementName>
<elementAttributes>
<entry>
<string>Label</string>
<string>64 bit, left</string>
</entry>
<entry>
<string>Testdata</string>
<testData>
<dataString>D^64_in sh^64 D^64
loop(n,64)
1 (n) (1&lt;&lt;n)
end loop
loop(n,64)
7 (n) (7&lt;&lt;n)
end loop</dataString>
</testData>
</entry>
</elementAttributes>
<pos x="580" y="-60"/>
</visualElement>
</visualElements>
<wires>
<wire>
<p1 x="160" y="400"/>
<p2 x="420" y="400"/>
</wire>
<wire>
<p1 x="480" y="960"/>
<p2 x="740" y="960"/>
@ -386,13 +474,37 @@ end loop</dataString>
<p2 x="740" y="160"/>
</wire>
<wire>
<p1 x="380" y="180"/>
<p2 x="420" y="180"/>
<p1 x="380" y="-100"/>
<p2 x="420" y="-100"/>
</wire>
<wire>
<p1 x="480" y="420"/>
<p2 x="740" y="420"/>
</wire>
<wire>
<p1 x="480" y="680"/>
<p2 x="740" y="680"/>
</wire>
<wire>
<p1 x="160" y="-140"/>
<p2 x="420" y="-140"/>
</wire>
<wire>
<p1 x="160" y="140"/>
<p2 x="420" y="140"/>
</wire>
<wire>
<p1 x="160" y="940"/>
<p2 x="420" y="940"/>
</wire>
<wire>
<p1 x="160" y="400"/>
<p2 x="420" y="400"/>
</wire>
<wire>
<p1 x="380" y="180"/>
<p2 x="420" y="180"/>
</wire>
<wire>
<p1 x="160" y="660"/>
<p2 x="420" y="660"/>
@ -401,26 +513,18 @@ end loop</dataString>
<p1 x="380" y="980"/>
<p2 x="420" y="980"/>
</wire>
<wire>
<p1 x="480" y="-120"/>
<p2 x="740" y="-120"/>
</wire>
<wire>
<p1 x="380" y="440"/>
<p2 x="420" y="440"/>
</wire>
<wire>
<p1 x="480" y="680"/>
<p2 x="740" y="680"/>
</wire>
<wire>
<p1 x="160" y="140"/>
<p2 x="420" y="140"/>
</wire>
<wire>
<p1 x="380" y="700"/>
<p2 x="420" y="700"/>
</wire>
<wire>
<p1 x="160" y="940"/>
<p2 x="420" y="940"/>
</wire>
</wires>
<measurementOrdering/>
</circuit>

View File

@ -30,9 +30,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="500" y="140"/>
@ -54,9 +52,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="400" y="120"/>
@ -74,9 +70,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=bitsNeededFor(args.dataBits-1);
}</string>
<string>this.Bits=bitsNeededFor(args.dataBits-1);</string>
</entry>
</elementAttributes>
<pos x="400" y="160"/>

View File

@ -35,9 +35,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="600" y="140"/>
@ -55,9 +53,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="280" y="120"/>

View File

@ -35,9 +35,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="600" y="140"/>
@ -55,9 +53,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="300" y="120"/>

View File

@ -35,9 +35,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="600" y="140"/>
@ -55,9 +53,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="300" y="120"/>

View File

@ -42,9 +42,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="540" y="140"/>
@ -66,9 +64,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="180" y="100"/>
@ -86,9 +82,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.shiftBits);
}</string>
<string>this.Bits=int(args.shiftBits);</string>
</entry>
</elementAttributes>
<pos x="180" y="140"/>

View File

@ -67,7 +67,7 @@
<entry>
<string>generic</string>
<string>dataBits := 32;
dir := &quot;left&quot;;</string>
direction := &quot;left&quot;;</string>
</entry>
</elementAttributes>
<pos x="420" y="120"/>

View File

@ -67,7 +67,7 @@
<entry>
<string>generic</string>
<string>dataBits := 8;
dir := &quot;left&quot;;</string>
direction := &quot;left&quot;;</string>
</entry>
</elementAttributes>
<pos x="420" y="400"/>

View File

@ -67,7 +67,7 @@
<entry>
<string>generic</string>
<string>dataBits := 8;
dir := &quot;right&quot;;</string>
direction := &quot;right&quot;;</string>
</entry>
</elementAttributes>
<pos x="420" y="660"/>

View File

@ -67,7 +67,7 @@
<entry>
<string>generic</string>
<string>dataBits := 16;
dir := &quot;arith&quot;;</string>
direction := &quot;arith&quot;;</string>
</entry>
</elementAttributes>
<pos x="420" y="940"/>

View File

@ -30,9 +30,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="500" y="140"/>
@ -54,9 +52,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="400" y="120"/>
@ -74,9 +70,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=bitsNeededFor(args.dataBits-1);
}</string>
<string>this.Bits=bitsNeededFor(args.dataBits-1);</string>
</entry>
</elementAttributes>
<pos x="400" y="160"/>
@ -86,13 +80,28 @@
<elementAttributes>
<entry>
<string>generic</string>
<string>dataBits:=16;
shiftBits:=int(4);
dir:=&quot;left&quot;;
if (isPresent(args)) {
dir=args.dir;
dataBits=args.dataBits;
shiftBits=bitsNeededFor(args.dataBits-1);
<string>if (isPresent(args)) {
if (args.direction=&quot;right&quot;) {
export circuit:=&quot;shift-fixed-right-inc.dig&quot;;
} else {
if (args.direction=&quot;arith&quot;) {
export circuit:=&quot;shift-fixed-arith-right-inc.dig&quot;;
} else {
if (args.direction=&quot;left&quot;) {
export circuit:=&quot;shift-fixed-left-inc.dig&quot;;
} else {
panic(&quot;only \&quot;left\&quot;, \&quot;right\&quot; or \&quot;arith\&quot; is allowed as direction, not \&quot;&quot;+args.dir+&quot;\&quot;!&quot;);
}
}
}
export shiftBits:=bitsNeededFor(args.dataBits-1);
} else {
// used if circuit is started as the main circuit
export circuit:=&quot;shift-fixed-left-inc.dig&quot;;
export dataBits:=16;
export shiftBits:=int(4);
}</string>
</entry>
</elementAttributes>

View File

@ -35,9 +35,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="600" y="140"/>
@ -55,9 +53,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="280" y="120"/>

View File

@ -35,9 +35,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="600" y="140"/>
@ -55,9 +53,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="300" y="120"/>

View File

@ -35,9 +35,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="600" y="140"/>
@ -55,9 +53,7 @@
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="300" y="120"/>

View File

@ -13,22 +13,13 @@
<elementAttributes>
<entry>
<string>generic</string>
<string>dataBits:=16;
shift:=8;
if (isPresent(args)) {
dataBits = args.dataBits;
shift = 1&lt;&lt;(args.shiftBits-1);
if (args.dir=&quot;right&quot;) {
setCircuit(&quot;shift-fixed-right-inc.dig&quot;);
} else {
if (args.dir=&quot;arith&quot;) {
setCircuit(&quot;shift-fixed-arith-right-inc.dig&quot;);
} else {
if (args.dir!=&quot;left&quot;) {
panic(&quot;only \&quot;left\&quot;, \&quot;right\&quot; or \&quot;arith\&quot; is allowed as direction, not \&quot;&quot;+args.dir+&quot;\&quot;!&quot;);
}
}
}
<string>if (isPresent(args)) {
export shift := 1&lt;&lt;(args.shiftBits-1);
setCircuit(args.circuit);
} else {
// used if circuit is started as the main circuit
export dataBits:=16;
export shift:=8;
}</string>
</entry>
</elementAttributes>
@ -51,9 +42,7 @@ if (isPresent(args)) {
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="540" y="140"/>
@ -75,9 +64,7 @@ if (isPresent(args)) {
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.dataBits);
}</string>
<string>this.Bits=int(args.dataBits);</string>
</entry>
</elementAttributes>
<pos x="180" y="100"/>
@ -95,9 +82,7 @@ if (isPresent(args)) {
</entry>
<entry>
<string>generic</string>
<string>if (isPresent(args)) {
this.Bits=int(args.shiftBits);
}</string>
<string>this.Bits=int(args.shiftBits);</string>
</entry>
</elementAttributes>
<pos x="180" y="140"/>
@ -107,31 +92,18 @@ if (isPresent(args)) {
<elementAttributes>
<entry>
<string>generic</string>
<string>dataBits:=16;
shiftBits:=3;
dir:=&quot;left&quot;;
if (isPresent(args)) {
dataBits = args.dataBits;
shiftBits = args.shiftBits-1;
dir=args.dir;
if (args.shiftBits=2) {
export shift := 1;
if (args.dir=&quot;right&quot;) {
setCircuit(&quot;shift-fixed-right-inc.dig&quot;);
<string>if (isPresent(args)) {
if (args.shiftBits=2) {
export shift := 1;
setCircuit(args.circuit);
} else {
if (args.dir=&quot;arith&quot;) {
setCircuit(&quot;shift-fixed-arith-right-inc.dig&quot;);
} else {
if (args.dir!=&quot;left&quot;) {
panic(&quot;only \&quot;left\&quot;, \&quot;right\&quot; or \&quot;arith\&quot; is allowed as direction, not \&quot;&quot;+args.dir+&quot;\&quot;!&quot;);
}
setCircuit(&quot;shift-fixed-left-inc.dig&quot;);
}
export shiftBits := args.shiftBits-1;
}
}
} else {
// used if circuit is started as the main circuit
export dataBits:=16;
export shiftBits:=3;
export circuit:=&quot;shift-fixed-left-inc.dig&quot;;
}</string>
</entry>
</elementAttributes>