STUDIO HAZE · jeniapp
Topaz source
Open by house policy. Topaz is our own language.
Topaz 5.20.2 · 63 files
apps/circuit/chips/alu.tpz
Topaz · 5376 B · Original file
1
// 산술논리장치 칩 라이브러리. 산술 라이브러리에 2:1 선택기와 4비트 산술논리장치 alu4 를 더한 칩 정의 글입니다.2
// 입력은 없고 출력은 정의 순서대로 이은 글입니다. alu4 는 extin a0..a3 b0..b3 op0 op1, extout y0..y3 cout zero 이고 op1 op0 이 00 ADD, 01 SUB, 10 AND, 11 OR 입니다.3
// 늘 같은 글을 냅니다. 뺄셈도 게이트로만 합니다. B 를 mode 와 XOR 해 비트를 뒤집고 자리올림 입력에 mode 를 넣어 2의 보수를 만듭니다.4
// 회로를 평가하지 않습니다. 신호 경로에 산술 연산자를 쓰지 않습니다.5
// ALU chip library: the arithmetic library plus a 2-to-1 mux and a 4-bit ALU.7
import chips.arith { 산술라이브러리 }9
// S 가 0 이면 D0, 1 이면 D1 을 냅니다. O = (D0 AND NOT S) OR (D1 AND S) 입니다.10
function 선택기() -> string {11
[12
"chipdef mux2\n",13
"node d0 INPUT 0 0\nnode d1 INPUT 0 40\nnode s INPUT 0 80\n",14
"node ns NOT 70 80\nnode t0 AND 140 10\nnode t1 AND 140 60\nnode o OR 220 35\n",15
"node out OUTPUT 300 35\n",16
"wire s:out ns:in0\nwire d0:out t0:in0\nwire ns:out t0:in1\n",17
"wire d1:out t1:in0\nwire s:out t1:in1\nwire t0:out o:in0\nwire t1:out o:in1\nwire o:out out:in0\n",18
"extin D0 d0\nextin D1 d1\nextin S s\nextout O out\nendchip\n",19
].join("")20
}22
// ADD 와 SUB 는 가산기 하나를 함께 씁니다. mode = AND(NOT op1, op0) 는 SUB 에서만 1 입니다.23
// 논리 선택기가 op0 으로 AND 와 OR 을 고르고 최종 선택기가 op1 로 산술과 논리를 고릅니다. zero 는 결과 네 비트의 NOR 입니다.24
function 산술논리장치() -> string {25
[26
"chipdef alu4\n",27
// 입력28
"node a0 INPUT 0 0\nnode a1 INPUT 0 30\nnode a2 INPUT 0 60\nnode a3 INPUT 0 90\n",29
"node b0 INPUT 0 140\nnode b1 INPUT 0 170\nnode b2 INPUT 0 200\nnode b3 INPUT 0 230\n",30
"node op0 INPUT 0 280\nnode op1 INPUT 0 310\n",31
// mode = AND(NOT op1, op0) 는 SUB 에서만 1 입니다32
"node nop1 NOT 80 310\nnode mode AND 150 295\n",33
// B 유효값 = XOR(b_i, mode)34
"node be0 XOR 230 140\nnode be1 XOR 230 170\nnode be2 XOR 230 200\nnode be3 XOR 230 230\n",35
// 공유 가산기36
"chip ad adder4 330 80\n",37
// 비트별 AND/OR38
"node an0 AND 230 0\nnode an1 AND 230 30\nnode an2 AND 230 60\nnode an3 AND 230 90\n",39
"node or0 OR 290 0\nnode or1 OR 290 30\nnode or2 OR 290 60\nnode or3 OR 290 90\n",40
// 논리 먹스: lm = mux2(AND, OR, op0)41
"chip lm0 mux2 380 0\nchip lm1 mux2 380 30\nchip lm2 mux2 380 60\nchip lm3 mux2 380 90\n",42
// 최종 먹스: y = mux2(arith, lm, op1)43
"chip fm0 mux2 500 0\nchip fm1 mux2 500 30\nchip fm2 mux2 500 60\nchip fm3 mux2 500 90\n",44
// 출력45
"node y0 OUTPUT 640 0\nnode y1 OUTPUT 640 30\nnode y2 OUTPUT 640 60\nnode y3 OUTPUT 640 90\nnode cout OUTPUT 640 140\n",46
// zero = NOR(y0..y3) = NOT(OR4)47
"node zo01 OR 560 200\nnode zo23 OR 560 240\nnode zoa OR 620 220\nnode znz NOT 680 220\nnode zero OUTPUT 740 220\n",48
// mode 배선49
"wire op1:out nop1:in0\nwire nop1:out mode:in0\nwire op0:out mode:in1\n",50
// B 유효값 배선51
"wire b0:out be0:in0\nwire mode:out be0:in1\nwire b1:out be1:in0\nwire mode:out be1:in1\n",52
"wire b2:out be2:in0\nwire mode:out be2:in1\nwire b3:out be3:in0\nwire mode:out be3:in1\n",53
// 가산기 입력54
"wire a0:out ad:a0\nwire a1:out ad:a1\nwire a2:out ad:a2\nwire a3:out ad:a3\n",55
"wire be0:out ad:b0\nwire be1:out ad:b1\nwire be2:out ad:b2\nwire be3:out ad:b3\nwire mode:out ad:cin\n",56
// 비트별 AND/OR 배선57
"wire a0:out an0:in0\nwire b0:out an0:in1\nwire a1:out an1:in0\nwire b1:out an1:in1\n",58
"wire a2:out an2:in0\nwire b2:out an2:in1\nwire a3:out an3:in0\nwire b3:out an3:in1\n",59
"wire a0:out or0:in0\nwire b0:out or0:in1\nwire a1:out or1:in0\nwire b1:out or1:in1\n",60
"wire a2:out or2:in0\nwire b2:out or2:in1\nwire a3:out or3:in0\nwire b3:out or3:in1\n",61
// 논리 먹스 배선62
"wire an0:out lm0:D0\nwire or0:out lm0:D1\nwire op0:out lm0:S\n",63
"wire an1:out lm1:D0\nwire or1:out lm1:D1\nwire op0:out lm1:S\n",64
"wire an2:out lm2:D0\nwire or2:out lm2:D1\nwire op0:out lm2:S\n",65
"wire an3:out lm3:D0\nwire or3:out lm3:D1\nwire op0:out lm3:S\n",66
// 최종 먹스 배선67
"wire ad:s0 fm0:D0\nwire lm0:O fm0:D1\nwire op1:out fm0:S\n",68
"wire ad:s1 fm1:D0\nwire lm1:O fm1:D1\nwire op1:out fm1:S\n",69
"wire ad:s2 fm2:D0\nwire lm2:O fm2:D1\nwire op1:out fm2:S\n",70
"wire ad:s3 fm3:D0\nwire lm3:O fm3:D1\nwire op1:out fm3:S\n",71
// 출력 배선72
"wire fm0:O y0:in0\nwire fm1:O y1:in0\nwire fm2:O y2:in0\nwire fm3:O y3:in0\nwire ad:cout cout:in0\n",73
// zero 배선74
"wire fm0:O zo01:in0\nwire fm1:O zo01:in1\nwire fm2:O zo23:in0\nwire fm3:O zo23:in1\n",75
"wire zo01:out zoa:in0\nwire zo23:out zoa:in1\nwire zoa:out znz:in0\nwire znz:out zero:in0\n",76
// 외부 핀77
"extin a0 a0\nextin a1 a1\nextin a2 a2\nextin a3 a3\n",78
"extin b0 b0\nextin b1 b1\nextin b2 b2\nextin b3 b3\nextin op0 op0\nextin op1 op1\n",79
"extout y0 y0\nextout y1 y1\nextout y2 y2\nextout y3 y3\nextout cout cout\nextout zero zero\n",80
"endchip\n",81
].join("")82
}84
// alu4 는 adder4 와 mux2 를 쓰므로 맨 뒤에 옵니다.85
export function 산술논리라이브러리() -> string {86
산술라이브러리() + 선택기() + 산술논리장치()87
}SHA256 f5a70486137150cba4b34dd7277c729066bedd024c2052806a2905e24155e97e