slow.monster

STUDIO HAZE · jeniapp

Topaz source

Open by house policy. Topaz is our own language.

Topaz 5.20.2 · 63 files

apps/circuit/chips/arith.tpz

Topaz · 2942 B · Original file

1// 산술 칩 라이브러리. 반가산기, 전가산기, 4비트 리플캐리 가산기를 칩 정의 글로 둡니다.
2// 입력은 없고 출력은 chipdef ... endchip 블록을 정의 순서대로 이은 글입니다. main 이 library arith 에서 회로 앞에 붙입니다.
3// 늘 같은 글을 냅니다. 게이트를 엮은 회로 글일 뿐이고 신호는 core.gate 진리표로만 계산합니다.
4// 회로를 평가하지 않습니다. 가산기에도 산술 연산자를 쓰지 않습니다.
5// Arithmetic chip library: half adder, full adder and a 4-bit ripple-carry adder as chip definitions.
7// 합은 XOR, 자리올림은 AND 입니다.
8function 반가산기() -> string {
9 "chipdef halfadder\nnode a INPUT 0 0\nnode b INPUT 0 40\nnode x XOR 60 0\nnode g AND 60 50\nnode s OUTPUT 130 0\nnode k OUTPUT 130 50\nwire a:out x:in0\nwire b:out x:in1\nwire a:out g:in0\nwire b:out g:in1\nwire x:out s:in0\nwire g:out k:in0\nextin A a\nextin B b\nextout S s\nextout K k\nendchip\n"
12// 반가산기 두 개와 OR 로 만듭니다. 자리올림은 세 입력의 다수결입니다.
13function 전가산기() -> string {
14 "chipdef fulladder\nnode fa INPUT 0 0\nnode fb INPUT 0 40\nnode fc INPUT 0 90\nnode fs OUTPUT 260 0\nnode fco OUTPUT 260 90\nchip h1 halfadder 70 0\nchip h2 halfadder 150 40\nnode orc OR 210 90\nwire fa:out h1:A\nwire fb:out h1:B\nwire h1:S h2:A\nwire fc:out h2:B\nwire h2:S fs:in0\nwire h1:K orc:in0\nwire h2:K orc:in1\nwire orc:out fco:in0\nextin A fa\nextin B fb\nextin Cin fc\nextout S fs\nextout Cout fco\nendchip\n"
17// 전가산기 네 개를 자리올림으로 잇습니다.
18function 사비트가산기() -> string {
19 [
20 "chipdef adder4\n",
21 "node a0 INPUT 0 0\nnode a1 INPUT 0 30\nnode a2 INPUT 0 60\nnode a3 INPUT 0 90\n",
22 "node b0 INPUT 0 130\nnode b1 INPUT 0 160\nnode b2 INPUT 0 190\nnode b3 INPUT 0 220\n",
23 "node cin INPUT 0 270\n",
24 "node s0 OUTPUT 460 0\nnode s1 OUTPUT 460 30\nnode s2 OUTPUT 460 60\nnode s3 OUTPUT 460 90\nnode cout OUTPUT 460 140\n",
25 "chip f0 fulladder 150 0\nchip f1 fulladder 150 90\nchip f2 fulladder 150 180\nchip f3 fulladder 150 270\n",
26 "wire a0:out f0:A\nwire b0:out f0:B\nwire cin:out f0:Cin\nwire f0:S s0:in0\nwire f0:Cout f1:Cin\n",
27 "wire a1:out f1:A\nwire b1:out f1:B\nwire f1:S s1:in0\nwire f1:Cout f2:Cin\n",
28 "wire a2:out f2:A\nwire b2:out f2:B\nwire f2:S s2:in0\nwire f2:Cout f3:Cin\n",
29 "wire a3:out f3:A\nwire b3:out f3:B\nwire f3:S s3:in0\nwire f3:Cout cout:in0\n",
30 "extin a0 a0\nextin a1 a1\nextin a2 a2\nextin a3 a3\n",
31 "extin b0 b0\nextin b1 b1\nextin b2 b2\nextin b3 b3\nextin cin cin\n",
32 "extout s0 s0\nextout s1 s1\nextout s2 s2\nextout s3 s3\nextout cout cout\n",
33 "endchip\n",
34 ].join("")
37// 칩은 앞에서 정의한 칩만 쓸 수 있어 의존하는 칩이 먼저 옵니다.
38export function 산술라이브러리() -> string {
39 반가산기() + 전가산기() + 사비트가산기()

SHA256 6802681e7cad41b457437ead1d0bcf6f711aab0a7c6dcb7e4760ca475c503f62