17 use Device
::SerialPort
;
19 my $port = Device
::SerialPort
->new($ARGV[0] // '/dev/ttyUSB1') or die "$!";
21 #$port->baudrate(4000000);
22 $port->parity('none');
25 $port->handshake('none');
26 $port->read_const_time(2000);
28 $port->write_settings or die "$!";
32 use Time
::HiRes qw
/sleep/;
34 sysopen my $port, '/dev/ttyUSB1', O_SYNC
| O_RDWR
or die "$!";
37 use parent qw
/Exporter/;
38 our @EXPORT = qw
/loada loadb store write_verilog alu_select_a alu_select_b alu_select_f alu_zero flag_zero flag_news alu_xor alu_xnor alu_or alu_of_function aluc_add alus_add aluc_addAF alus_addAF alu2 alu3 add addC/;
39 our @EXPORT_OK = qw
/loada loadb store write_verilog alu_select_a alu_select_b alu_select_f alu_zero flag_zero flag_news alu_xor alu_xnor alu_or alu_of_function aluc_add alus_add aluc_addAF alus_addAF alu2 alu3 add addC/;
41 use File
::Slurp
::Tiny
'write_file';
47 my $binary = pack 'vCC', @cmd{qw
/I mem_addr op/}; # we ignore CS for now
48 my $length = length $binary;
49 my $wrote = syswrite $port, $binary, $length;
51 # say "Wrote $wrote of $length bytes";
52 if ($cmd{op
} == OP_READ
) {
54 my $count_in = sysread $port, $string_in, 2;
55 my @memory = unpack 'v*', $string_in;
64 my ($addr, $flagr, $bsel, $aluc) = @_;
70 { I
=> $I, mem_addr
=> $addr, op
=> OP_LOADA
, CS
=> 0 }
74 my ($addr, $cond, $inv, $alus) = @_;
80 { I
=> $I, mem_addr
=> $addr, op
=> OP_LOADB
, CS
=> 0 }
85 send_
{ I
=> 0, mem_addr
=> $addr, op
=> OP_READ
, CS
=> 1 }
89 my ($addr, $flagw, $edge_, $cube) = @_;
95 { I
=> $I, mem_addr
=> $addr, op
=> OP_STORE
, CS
=> 0 }
101 { I
=> $I, mem_addr
=> $addr, op
=> OP_LOADI
, CS
=> 0 }
107 sub flag_news
{ 8 + $_[0] }
133 sub alu_of_function
(&) {
137 local $a = ($i & 4) >> 2;
138 local $b = ($i & 2) >> 1;
140 $alu += ($fun->() ?
1 : 0) << $i;
145 sub aluc_add
{ alu_of_function
{ ($a + $b + $_) & 2 } }
146 sub alus_add
{ alu_of_function
{ ($a + $b + $_) & 1 } }
148 sub aluc_addAF
{ alu_of_function
{ ($a + $_) & 2 } }
149 sub alus_addAF
{ alu_of_function
{ ($a + $_) & 1 } }
151 sub alu_or
{ alu_of_function
{ $a | $b | $_ } }
154 my ($aluc, $alus, $addrA, $addrB, $flagr, $flagw, $cond, $inv) = @_;
155 loada
$addrA, $flagr, 0, $aluc;
156 loadb
$addrB, $cond, $inv, $alus;
157 store
$addrA, $flagw, 0, 0;
161 my ($aluc, $alus, $addrA, $addrB, $addrC, $flagr, $flagw) = @_;
162 loada
$addrA, $flagr, 0, $aluc;
163 loadb
$addrB, 0, 1, $alus;
164 store
$addrC, $flagw, 0, 0;
168 my ($addrA, $addrB, $addrC, $flag_carry) = @_;
169 alu3 aluc_add
, alus_add
, $addrA, $addrB, $addrC, flag_zero
, $flag_carry;
173 my ($addrA, $addrB, $addrC, $flag_carry) = @_;
174 alu3 aluc_add
, alus_add
, $addrA, $addrB, $addrC, $flag_carry, $flag_carry;
177 # news_gen face partea de mijloc
178 # news_[mf][mf] face primul alu3, apeleaza news_gen, apoi face ultimul alu3
180 my ($nX, $nY, $dest) = @_;
195 if ($nX || $nY) { # not the last go
196 alu3 alu_select_f
, alu_select_a
, 0, 0, 0, flag_news
($direction), flag_zero
197 } elsif (exists $dest{address
}) {
198 alu3 alu_select_f
, alu_select_f
, 0, 0, $dest{address
}, flag_news
($direction), flag_zero
199 } elsif (exists $dest{flag
}) {
200 alu3 alu_select_f
, alu_select_a
, 0, 0, 0, flag_news
($direction), $dest{flag
}
202 die "No destination address nor flag given to [news_generic]\n"
208 my ($addrIN, $addrOUT, $nX, $nY) = @_;
209 alu3 alu_select_a
, alu_select_a
, $addrIN, 0, $addrIN, flag_zero
, flag_zero
;
210 news_generic
$nX, $nY, {address
=> $addrOUT};
214 my ($addrIN, $flagOUT, $nX, $nY) = @_;
215 alu3 alu_select_a
, alu_select_a
, $addrIN, 0, $addrIN, flag_zero
, flag_zero
;
216 news_generic
$nX, $nY, {flag
=> $flagOUT};
220 my ($flagIN, $addrOUT, $nX, $nY) = @_;
221 alu3 alu_select_f
, alu_select_a
, 0, 0, 0, $flagIN, flag_zero
;
222 news_generic
$nX, $nY, {address
=> $addrOUT};
226 my ($flagIN, $flagOUT, $nX, $nY) = @_;
227 alu3 alu_select_f
, alu_select_a
, 0, 0, 0, $flagIN, flag_zero
;
228 news_generic
$nX, $nY, {flag
=> $flagOUT};
This page took 0.034151 seconds and 4 git commands to generate.