mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-13 14:56:29 -04:00
improved the barrel shifter
This commit is contained in:
parent
058824530c
commit
e152fbbef1
@ -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 := "left";</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<<n)
|
||||
end loop
|
||||
|
||||
loop(n,64)
|
||||
7 (n) (7<<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>
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -67,7 +67,7 @@
|
||||
<entry>
|
||||
<string>generic</string>
|
||||
<string>dataBits := 32;
|
||||
dir := "left";</string>
|
||||
direction := "left";</string>
|
||||
</entry>
|
||||
</elementAttributes>
|
||||
<pos x="420" y="120"/>
|
||||
|
@ -67,7 +67,7 @@
|
||||
<entry>
|
||||
<string>generic</string>
|
||||
<string>dataBits := 8;
|
||||
dir := "left";</string>
|
||||
direction := "left";</string>
|
||||
</entry>
|
||||
</elementAttributes>
|
||||
<pos x="420" y="400"/>
|
||||
|
@ -67,7 +67,7 @@
|
||||
<entry>
|
||||
<string>generic</string>
|
||||
<string>dataBits := 8;
|
||||
dir := "right";</string>
|
||||
direction := "right";</string>
|
||||
</entry>
|
||||
</elementAttributes>
|
||||
<pos x="420" y="660"/>
|
||||
|
@ -67,7 +67,7 @@
|
||||
<entry>
|
||||
<string>generic</string>
|
||||
<string>dataBits := 16;
|
||||
dir := "arith";</string>
|
||||
direction := "arith";</string>
|
||||
</entry>
|
||||
</elementAttributes>
|
||||
<pos x="420" y="940"/>
|
||||
|
@ -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:="left";
|
||||
if (isPresent(args)) {
|
||||
dir=args.dir;
|
||||
dataBits=args.dataBits;
|
||||
shiftBits=bitsNeededFor(args.dataBits-1);
|
||||
<string>if (isPresent(args)) {
|
||||
|
||||
if (args.direction="right") {
|
||||
export circuit:="shift-fixed-right-inc.dig";
|
||||
} else {
|
||||
if (args.direction="arith") {
|
||||
export circuit:="shift-fixed-arith-right-inc.dig";
|
||||
} else {
|
||||
if (args.direction="left") {
|
||||
export circuit:="shift-fixed-left-inc.dig";
|
||||
} else {
|
||||
panic("only \"left\", \"right\" or \"arith\" is allowed as direction, not \""+args.dir+"\"!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export shiftBits:=bitsNeededFor(args.dataBits-1);
|
||||
} else {
|
||||
// used if circuit is started as the main circuit
|
||||
export circuit:="shift-fixed-left-inc.dig";
|
||||
export dataBits:=16;
|
||||
export shiftBits:=int(4);
|
||||
}</string>
|
||||
</entry>
|
||||
</elementAttributes>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -13,22 +13,13 @@
|
||||
<elementAttributes>
|
||||
<entry>
|
||||
<string>generic</string>
|
||||
<string>dataBits:=16;
|
||||
shift:=8;
|
||||
if (isPresent(args)) {
|
||||
dataBits = args.dataBits;
|
||||
shift = 1<<(args.shiftBits-1);
|
||||
if (args.dir="right") {
|
||||
setCircuit("shift-fixed-right-inc.dig");
|
||||
} else {
|
||||
if (args.dir="arith") {
|
||||
setCircuit("shift-fixed-arith-right-inc.dig");
|
||||
} else {
|
||||
if (args.dir!="left") {
|
||||
panic("only \"left\", \"right\" or \"arith\" is allowed as direction, not \""+args.dir+"\"!");
|
||||
}
|
||||
}
|
||||
}
|
||||
<string>if (isPresent(args)) {
|
||||
export shift := 1<<(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:="left";
|
||||
if (isPresent(args)) {
|
||||
dataBits = args.dataBits;
|
||||
shiftBits = args.shiftBits-1;
|
||||
dir=args.dir;
|
||||
if (args.shiftBits=2) {
|
||||
|
||||
export shift := 1;
|
||||
if (args.dir="right") {
|
||||
setCircuit("shift-fixed-right-inc.dig");
|
||||
<string>if (isPresent(args)) {
|
||||
if (args.shiftBits=2) {
|
||||
export shift := 1;
|
||||
setCircuit(args.circuit);
|
||||
} else {
|
||||
if (args.dir="arith") {
|
||||
setCircuit("shift-fixed-arith-right-inc.dig");
|
||||
} else {
|
||||
if (args.dir!="left") {
|
||||
panic("only \"left\", \"right\" or \"arith\" is allowed as direction, not \""+args.dir+"\"!");
|
||||
}
|
||||
setCircuit("shift-fixed-left-inc.dig");
|
||||
}
|
||||
export shiftBits := args.shiftBits-1;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
} else {
|
||||
// used if circuit is started as the main circuit
|
||||
export dataBits:=16;
|
||||
export shiftBits:=3;
|
||||
export circuit:="shift-fixed-left-inc.dig";
|
||||
}</string>
|
||||
</entry>
|
||||
</elementAttributes>
|
||||
|
Loading…
x
Reference in New Issue
Block a user