-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfulladder.c
66 lines (59 loc) · 2.13 KB
/
fulladder.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "gates.h"
void fulladder(port_t ain, port_t bin, port_t cin, port_t sum, port_t cout) {
assert(PTYPE_EXT == ain->pt);
assert(PTYPE_EXT == bin->pt);
assert(PTYPE_EXT == cin->pt);
assert(PTYPE_EXT == sum->pt);
assert(PTYPE_EXT == cout->pt);
port_t HA1a = port(PTYPE_IN, 1, "_HA1a");
port_t HA1b = port(PTYPE_IN, 1, "_HA1b");
port_t HA1c = port(PTYPE_IN, 1, "_HA1c");
port_t HA1s = port(PTYPE_OUT, 1, "_HA1s");
port_t HA1d = port(PTYPE_OUT, 1, "_HA1d");
port_t HA2a = port(PTYPE_IN, 1, "_HA2a");
port_t HA2b = port(PTYPE_IN, 1, "_HA2b");
port_t HA2c = port(PTYPE_IN, 1, "_HA2c");
port_t HA2s = port(PTYPE_OUT, 1, "_HA2s");
port_t HA2d = port(PTYPE_OUT, 1, "_HA2d");
port_t Cout1 = port(PTYPE_IN, 1, "_Cout1");
port_t Cout2 = port(PTYPE_IN, 1, "_Cout2");
port_t Cout = port(PTYPE_OUT, 1, "_Cout");
gate(OP_XOR, HA1s, HA1a, HA1b); gate(OP_AND, HA1d, HA1a, HA1b);
gate(OP_XOR, HA2s, HA2a, HA2b); gate(OP_AND, HA2d, HA2a, HA2b);
gate(OP_OR, Cout, Cout1, Cout2);
wire(ain, HA1a); wire(bin, HA1b);
wire(HA1s, HA2a); wire(cin, HA2b);
wire(HA1d, Cout1); wire(HA2d, Cout2);
wire(HA2s, sum); wire(Cout, cout);
}
int main(void) {
sim_init();
port_t A = port(PTYPE_EXT, 0);
port_t B = port(PTYPE_EXT, 0);
port_t C = port(PTYPE_EXT, 0);
port_t S = port(PTYPE_EXT, 0);
port_t D = port(PTYPE_EXT, 0);
delay = 2;
fulladder(A, B, C, S, D);
unsigned t = get_sim_time();
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
set_port(A, i%2 == 0, t);
set_port(B, j%2 == 0, t);
set_port(C, k%2 == 0, t);
for (int n = 0; n < 4; n++) {
printf("[%du] %d %d %d %d %d\n",
t, get_port(A), get_port(B), get_port(C), get_port(S), get_port(D));
sim_run(1); t++;
assert(get_sim_time() == t);
}
}
}
}
return EXIT_SUCCESS;
}