Four bit adder: Difference between revisions
Content added Content deleted
m (enclosed the titles of the illustrations in parenthesis to help identify the different parts of the illustration.) |
(→{{header|UNIX Shell}}: Add implementation.) |
||
Line 6,028: | Line 6,028: | ||
return getWord(%r0,1) SPC getWord(%r1,1) SPC getWord(%r2,1) SPC getWord(%r3,1) SPC getWord(%r3,0); |
return getWord(%r0,1) SPC getWord(%r1,1) SPC getWord(%r2,1) SPC getWord(%r3,1) SPC getWord(%r3,0); |
||
}</lang> |
}</lang> |
||
=={{header|UNIX Shell}}== |
|||
{{trans|Raku}} |
|||
{{works with|Bourne Again SHell}} |
|||
{{works with|Korn Shell}} |
|||
{{works with|Z Shell}} |
|||
Bash and zsh allow the snake_case function names to be replaced with kebab-case; ksh does not. The use of the <tt>typeset</tt> synonym for <tt>local</tt> is also in order to achieve ksh compatibility. |
|||
<lang sh>xor() { |
|||
typeset -i a=$1 b=$2 |
|||
printf '%d\n' $(( (a || b) && ! (a && b) )) |
|||
} |
|||
half_adder() { |
|||
typeset -i a=$1 b=$2 |
|||
printf '%d %d\n' $(xor $a $b) $(( a && b )) |
|||
} |
|||
full_adder() { |
|||
typeset -i a=$1 b=$2 c=$3 |
|||
typeset -i ha0_s ha0_c ha1_s ha1_c |
|||
read ha0_s ha0_c < <(half_adder "$c" "$a") |
|||
read ha1_s ha1_c < <(half_adder "$ha0_s" "$b") |
|||
printf '%d %d\n' "$ha1_s" "$(( ha0_c || ha1_c ))" |
|||
} |
|||
four_bit_addr() { |
|||
typeset -i a0=$1 a1=$2 a2=$3 a3=$4 b0=$5 b1=$6 b2=$7 b3=$8 |
|||
typeset -i fa0_s fa0_c fa1_s fa1_c fa2_s fa2_c fa3_s fa3_c |
|||
read fa0_s fa0_c < <(full_adder "$a0" "$b0" 0) |
|||
read fa1_s fa1_c < <(full_adder "$a1" "$b1" "$fa0_c") |
|||
read fa2_s fa2_c < <(full_adder "$a2" "$b2" "$fa1_c") |
|||
read fa3_s fa3_c < <(full_adder "$a3" "$b3" "$fa2_c") |
|||
printf '%s' "$fa0_s" |
|||
printf ' %s' "$fa1_s" "$fa2_s" "$fa3_s" "$fa3_c" |
|||
printf '\n' |
|||
} |
|||
is() { |
|||
typeset label=$1 |
|||
shift |
|||
if eval "$*"; then |
|||
printf 'ok' |
|||
else |
|||
printf 'not ok' |
|||
fi |
|||
printf ' %s\n' "$label" |
|||
} |
|||
is "1 + 1 = 2" "[[ '$(four_bit_addr 1 0 0 0 1 0 0 0)' == '0 1 0 0 0' ]]" |
|||
is "5 + 5 = 10" "[[ '$(four_bit_addr 1 0 1 0 1 0 1 0)' == '0 1 0 1 0' ]]" |
|||
is "7 + 9 = overflow" "a=($(four_bit_addr 1 0 0 1 1 1 1 0)); (( \${a[-1]}==1 ))" |
|||
</lang> |
|||
{{Out}} |
|||
<pre>ok 1 + 1 = 2 |
|||
ok 5 + 5 = 10 |
|||
ok 7 + 9 = overflow</pre> |
|||
=={{header|Verilog}}== |
=={{header|Verilog}}== |