From ba7630c03c33de3d983777f27fc9dcb869318aff Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sat, 18 May 2024 17:03:03 +0200 Subject: [PATCH] added test5 in gallery --- gallery/test5.pdf | Bin 0 -> 39971 bytes gallery/test5.typ | 435 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 435 insertions(+) create mode 100644 gallery/test5.pdf create mode 100644 gallery/test5.typ diff --git a/gallery/test5.pdf b/gallery/test5.pdf new file mode 100644 index 0000000000000000000000000000000000000000..17c13f0179c536739d044e2cb8e39ebe7cdbc097 GIT binary patch literal 39971 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

3B=|mL98%hH!yF&!aKJYBX9)wBS?e=! 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 literal 0 HcmV?d00001 diff --git a/gallery/test5.typ b/gallery/test5.typ new file mode 100644 index 0000000..f8a14ce --- /dev/null +++ b/gallery/test5.typ @@ -0,0 +1,435 @@ +#import "@preview/cetz:0.2.2": draw +#import "../src/lib.typ": * + +#set page(flipped: true, paper: "a3") + +#circuit({ + element.multiplexer( + x: 0, y: 0, w: .5, h: 1.5, id: "PCMux", + entries: 2, + fill: util.colors.blue, + h-ratio: 80% + ) + element.block( + x: (rel: 2, to: "PCMux.east"), + y: (from: "PCMux-port-out", to: "in"), + w: 1, h: 1.5, id: "PCBuf", + ports: ( + north: ((id: "clk", clock: true),), + west: ((id: "in"),), + east: ((id: "out"),) + ), + fill: util.colors.green + ) + + element.block( + x: (rel: 2, to: "PCBuf.east"), + y: (from: "PCBuf-port-out", to: "A"), + w: 3, h: 4, id: "IMem", + ports: ( + west: ( + (id: "A", name: "A"), + ), + east: ( + (id: "RD", name: "RD"), + ) + ), + ports-margins: ( + west: (0%, 50%), + east: (0%, 50%) + ), + fill: util.colors.green, + name: "Instruction\nMemory" + ) + element.block( + x: (rel: 3, to: "IMem.east"), + y: (from: "IMem-port-RD", to: "A1"), + w: 4.5, h: 4, id: "RegFile", + ports: ( + north: ( + (id: "clk", clock: true, small: true), + (id: "WE3", name: "WE3"), + (id: "dummy1") + ), + west: ( + (id: "dummy2"), + (id: "A1", name: "A1"), + (id: "dummy3"), + (id: "A2", name: "A2"), + (id: "A3", name: "A3"), + (id: "dummy4"), + (id: "WD3", name: "WD3"), + ), + east: ( + (id: "RD1", name: "RD1"), + (id: "RD2", name: "RD2"), + ) + ), + ports-margins: ( + north: (-20%, -20%), + east: (0%, 10%) + ), + fill: util.colors.green, + name: "Register\nFile" + ) + + element.alu( + x: (rel: -.7, to: "IMem.center"), + y: -7, + w: 1.4, h: 2.8, id: "PCAdd", + name: text("+", size: 1.5em), + name-anchor: "name", + fill: util.colors.pink + ) + element.extender( + x: (rel: 0, to: "RegFile.west"), + y: (from: "PCAdd-port-out", to: "in"), + w: 4, h: 1.5, id: "Ext", + h-ratio: 50%, + name: "Extend", + name-anchor: "south", + align-out: false, + fill: util.colors.green + ) + + element.multiplexer( + x: (rel: 3, to: "RegFile.east"), + y: (from: "RegFile-port-RD2", to: "in0"), + w: .5, h: 1.5, id: "SrcBMux", + fill: util.colors.blue, + h-ratio: 80% + ) + + element.alu( + x: (rel: 2, to: "SrcBMux.east"), + y: (from: "SrcBMux-port-out", to: "in2"), + w: 1.4, h: 2.8, id: "ALU", + name: rotate("ALU", -90deg), + name-anchor: "name", + fill: util.colors.pink + ) + element.alu( + x: (rel: 2, to: "SrcBMux.east"), + y: (from: "Ext-port-out", to: "in2"), + w: 1.4, h: 2.8, id: "JumpAdd", + name: text("+", size: 1.5em), + name-anchor: "name", + fill: util.colors.pink + ) + + element.block( + x: (rel: 4, to: "ALU.east"), + y: (from: "ALU-port-out", to: "A"), + w: 3, h: 4, id: "DMem", + name: "Data\nMemory", + ports: ( + north: ( + (id: "clk", clock: true, small: true), + (id: "dummy1"), + (id: "WE", name: "WE") + ), + west: ( + (id: "A", name: "A"), + (id: "WD", name: "WD") + ), + east: ( + (id: "RD", name: "RD"), + (id: "dummy2") + ) + ), + ports-margins: ( + north: (-10%, -10%), + west: (-20%, -30%), + east: (-10%, -20%) + ), + fill: util.colors.green + ) + + element.multiplexer( + x: (rel: 3, to: "DMem.east"), + y: (from: "DMem-port-RD", to: "in1"), + w: .5, h: 1.5, id: "ResMux", + entries: 2, + fill: util.colors.blue, + h-ratio: 80% + ) + + element.block( + x: (rel: 0, to: "RegFile.west"), + y: 3.5, w: 2.5, h: 5, id: "Ctrl", + name: "Control\nUnit", + name-anchor: "north", + ports: ( + west: ( + (id: "op", name: "op"), + (id: "funct3", name: "funct3"), + (id: "funct7", name: [funct7#sub("[5]")]), + (id: "zero", name: "Zero"), + ), + east: ( + (id: "PCSrc"), + (id: "ResSrc"), + (id: "MemWrite"), + (id: "ALUCtrl"), + (id: "ALUSrc"), + (id: "ImmSrc"), + (id: "RegWrite"), + ) + ), + ports-margins: ( + west: (40%, 0%) + ), + fill: util.colors.orange + ) + + // Wires + wire.wire( + "wPCNext", ("PCMux-port-out", "PCBuf-port-in"), + name: "PCNext" + ) + wire.stub("PCBuf-port-clk", "north", name: "clk", length: 0.25) + wire.wire( + "wPC1", ("PCBuf-port-out", "IMem-port-A"), + name: "PC" + ) + wire.wire( + "wPC2", ("PCBuf-port-out", "JumpAdd-port-in1"), + style: "zigzag", + zigzag-ratio: 1 + ) + wire.wire( + "wPC3", ("PCBuf-port-out", "PCAdd-port-in1"), + style: "zigzag", + zigzag-ratio: 1 + ) + wire.intersection("wPC2.zig", radius: 2pt) + wire.intersection("wPC2.zag", radius: 2pt) + wire.stub("PCAdd-port-in2", "west", name: "4", length: 1.5) + wire.wire( + "wPC+4", ("PCAdd-port-out", "PCMux-port-in0"), + style: "dodge", + dodge-sides: ("east", "west"), + dodge-y: -7.5, + dodge-margins: (1.2, .5), + name: "PC+4", + name-pos: "start" + ) + + let mid = ("IMem-port-RD", 50%, "RegFile-port-A1") + wire.wire( + "wInstr", ("IMem-port-RD", mid), + bus: true, + name: "Instr", + name-pos: "start" + ) + draw.hide({ + draw.line(name: "bus-top", + mid, + (horizontal: (), vertical: "Ctrl-port-op") + ) + draw.line(name: "bus-bot", + mid, + (horizontal: (), vertical: "Ext-port-in") + ) + }) + wire.wire( + "wInstrBus", ("bus-top.end", "bus-bot.end"), + bus: true + ) + wire.wire( + "wOp", ("Ctrl-port-op", (horizontal: mid, vertical: ())), + bus: true, + reverse: true, + slice: (6, 0) + ) + wire.wire( + "wF3", ("Ctrl-port-funct3", (horizontal: mid, vertical: ())), + bus: true, + reverse: true, + slice: (14, 12) + ) + wire.wire( + "wF7", ("Ctrl-port-funct7", (horizontal: mid, vertical: ())), + bus: true, + reverse: true, + slice: (30,) + ) + wire.wire( + "wA1", ("RegFile-port-A1", (horizontal: mid, vertical: ())), + bus: true, + reverse: true, + slice: (19, 15) + ) + wire.wire( + "wA2", ("RegFile-port-A2", (horizontal: mid, vertical: ())), + bus: true, + reverse: true, + slice: (24, 20) + ) + wire.wire( + "wA3", ("RegFile-port-A3", (horizontal: mid, vertical: ())), + bus: true, + reverse: true, + slice: (11, 7) + ) + wire.wire( + "wExt", ("Ext-port-in", (horizontal: mid, vertical: ())), + bus: true, + reverse: true, + slice: (31, 7) + ) + wire.intersection("wF3.end", radius: 2pt) + wire.intersection("wF7.end", radius: 2pt) + wire.intersection("wA1.end", radius: 2pt) + wire.intersection("wA2.end", radius: 2pt) + wire.intersection("wA3.end", radius: 2pt) + + wire.stub("RegFile-port-clk", "north", name: "clk", length: 0.25) + wire.wire("wRD2", ("RegFile-port-RD2", "SrcBMux-port-in0")) + wire.wire( + "wWD", ("RegFile-port-RD2", "DMem-port-WD"), + style: "zigzag", + zigzag-ratio: 1.5, + name: "WriteData", + name-pos: "end" + ) + wire.intersection("wWD.zig", radius: 2pt) + + wire.wire( + "wImmALU", ("Ext-port-out", "SrcBMux-port-in1"), + style: "zigzag", + zigzag-ratio: 2.5, + name: "ImmExt", + name-pos: "start" + ) + wire.wire( + "wImmJump", ("Ext-port-out", "JumpAdd-port-in2") + ) + wire.intersection("wImmALU.zig", radius: 2pt) + wire.wire( + "wJumpPC", ("JumpAdd-port-out", "PCMux-port-in1"), + style: "dodge", + dodge-sides: ("east", "west"), + dodge-y: -8, + dodge-margins: (1, 1), + name: "PCTarget", + name-pos: "start" + ) + + wire.wire( + "wSrcA", ("RegFile-port-RD1", "ALU-port-in1"), + name: "SrcA", + name-pos: "end" + ) + wire.wire( + "wSrcB", ("SrcBMux-port-out", "ALU-port-in2"), + name: "SrcB", + name-pos: "end" + ) + + wire.wire( + "wZero", ( + ("ALU.north-east", 50%, "ALU-port-out"), + "Ctrl-port-zero" + ), + style: "dodge", + dodge-sides: ("east", "west"), + dodge-y: 3, + dodge-margins: (1.5, 1), + name: "Zero", + name-pos: "start" + ) + wire.wire( + "wALURes1", ("ALU-port-out", "DMem-port-A"), + name: "ALUResult", + name-pos: "start" + ) + wire.wire( + "wALURes2", ("ALU-port-out", "ResMux-port-in0"), + style: "dodge", + dodge-sides: ("east", "west"), + dodge-y: 2, + dodge-margins: (3, 2) + ) + wire.intersection("wALURes2.start2", radius: 2pt) + + wire.stub("DMem-port-clk", "north", name: "clk", length: 0.25) + wire.wire( + "wRD", ("DMem-port-RD", "ResMux-port-in1"), + name: "ReadData", + name-pos: "start" + ) + + wire.wire( + "wRes", ("ResMux-port-out", "RegFile-port-WD3"), + style: "dodge", + dodge-sides: ("east", "west"), + dodge-y: -7.5, + dodge-margins: (1, 2) + ) + draw.content( + "wRes.dodge-start", + "Result", + anchor: "south-east", + padding: 5pt + ) + + // Other wires + draw.group({ + draw.stroke(util.colors.blue) + draw.line(name: "wPCSrc", + "Ctrl-port-PCSrc", + (horizontal: "RegFile.east", vertical: ()), + (horizontal: (), vertical: (rel: (0, 0.5), to: "Ctrl.north")), + (horizontal: "PCMux.north", vertical: ()), + "PCMux.north" + ) + draw.line(name: "wResSrc", + "Ctrl-port-ResSrc", + (horizontal: "ResMux.north", vertical: ()), + "ResMux.north" + ) + draw.line(name: "wMemWrite", + "Ctrl-port-MemWrite", + (horizontal: "DMem-port-WE", vertical: ()), + "DMem-port-WE" + ) + draw.line(name: "wALUCtrl", + "Ctrl-port-ALUCtrl", + (horizontal: "ALU.north", vertical: ()), + "ALU.north" + ) + draw.line(name: "wALUSrc", + "Ctrl-port-ALUSrc", + (horizontal: "SrcBMux.north", vertical: ()), + "SrcBMux.north" + ) + draw.line(name: "wImmSrc", + "Ctrl-port-ImmSrc", + (rel: (1, 0), to: (horizontal: "RegFile.east", vertical: ())), + (horizontal: (), vertical: (rel: (0, -.5), to: "RegFile.south")), + (horizontal: "Ext.north", vertical: ()), + "Ext.north" + ) + draw.line(name: "wRegWrite", + "Ctrl-port-RegWrite", + (rel: (.5, 0), to: (horizontal: "RegFile.east", vertical: ())), + (horizontal: (), vertical: ("Ctrl.south", 50%, "RegFile.north")), + (horizontal: "RegFile-port-WE3", vertical: ()), + "RegFile-port-WE3" + ) + + let names = ( + "PCSrc": "PCSrc", + "ResSrc": "ResultSrc", + "MemWrite": "MemWrite", + "ALUCtrl": [ALUControl#sub("[2:0]")], + "ALUSrc": "ALUSrc", + "ImmSrc": [ImmSrc#sub("[1:0]")], + "RegWrite": "RegWrite" + ) + for (port, name) in names { + draw.content("Ctrl-port-"+port, name, anchor: "south-west", padding: 3pt) + } + }) +}) \ No newline at end of file