312 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Typst
		
	
	
	
	
	
			
		
		
	
	
			312 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Typst
		
	
	
	
	
	
| #import "../src/lib.typ": circuit, element, util, wire
 | |
| 
 | |
| #set page(flipped: true)
 | |
| 
 | |
| #circuit({
 | |
|   element.block(
 | |
|     x: 0, y: 0, w: 1.5, h: 2.2,
 | |
|     id: "PCBuf",
 | |
|     fill: util.colors.orange,
 | |
|     ports: (
 | |
|       west: (
 | |
|         (id: "PCNext"),
 | |
|       ),
 | |
|       north: (
 | |
|         (id: "CLK", clock: true),
 | |
|       ),
 | |
|       east: (
 | |
|         (id: "PC"),
 | |
|       ),
 | |
|       south: (
 | |
|         (id: "EN", name: "EN"),
 | |
|       )
 | |
|     )
 | |
|   )
 | |
|   wire.stub("PCBuf-port-CLK", "north", name: "CLK")
 | |
|   wire.stub("PCBuf-port-EN", "south", name: "PCWrite")
 | |
|   
 | |
|   element.multiplexer(
 | |
|     x: (rel: 1.5, to: "PCBuf.east"),
 | |
|     y: (from: "PCBuf-port-PC", to: "in0"),
 | |
|     w: 1, h: 2,
 | |
|     id: "AdrSrc-MP",
 | |
|     fill: util.colors.orange,
 | |
|     entries: 2
 | |
|   )
 | |
|   wire.wire(
 | |
|     "wPCBuf-InstDataMgr", (
 | |
|       "PCBuf-port-PC",
 | |
|       "AdrSrc-MP-port-in0"
 | |
|     ),
 | |
|     name: "PC",
 | |
|     bus: true
 | |
|   )
 | |
|   wire.stub("AdrSrc-MP.north", "north", name: "AdrSrc")
 | |
|   
 | |
|   element.block(
 | |
|     x: (rel: 2, to: "AdrSrc-MP.east"),
 | |
|     y: (from: "AdrSrc-MP-port-out", to: "A"),
 | |
|     w: 3, h: 4,
 | |
|     id: "InstDataMgr",
 | |
|     fill: util.colors.yellow,
 | |
|     ports: (
 | |
|       west: (
 | |
|         (id: "A", name: "A"),
 | |
|         (id: "WD", name: "WD")
 | |
|       ),
 | |
|       north: (
 | |
|         (id: "CLK", clock: true),
 | |
|         (id: "WE", name: "WE", vertical: true),
 | |
|         (id: "IRWrite", name: "IRWrite", vertical: true)
 | |
|       ),
 | |
|       east: (
 | |
|         (id: "Instr", name: "Instr."),
 | |
|         (id: "RD", name: "RD")
 | |
|       )
 | |
|     ),
 | |
|     ports-margins: (
 | |
|       west: (30%, 0%),
 | |
|       east: (40%, 0%)
 | |
|     )
 | |
|   )
 | |
|   wire.wire(
 | |
|     "wAdrSrcMP-InstDataMgr", (
 | |
|       "AdrSrc-MP-port-out",
 | |
|       "InstDataMgr-port-A"
 | |
|     ),
 | |
|     name: "Adr",
 | |
|     name-pos: "end",
 | |
|     bus: true
 | |
|   )
 | |
|   
 | |
|   wire.stub("InstDataMgr-port-CLK", "north", name: "CLK")
 | |
|   wire.stub("InstDataMgr-port-WE", "north")
 | |
|   wire.stub("InstDataMgr-port-IRWrite", "north")
 | |
|   wire.stub("InstDataMgr-port-WD", "west")
 | |
| 
 | |
|   element.block(
 | |
|     x: (rel: 6, to: "InstDataMgr.east"),
 | |
|     y: (from: "InstDataMgr-port-RD", to: "WD3"), w: 3, h: 4,
 | |
|     id: "RegFile",
 | |
|     fill: util.colors.pink,
 | |
|     ports: (
 | |
|       west: (
 | |
|         (id: "A1", name: "A1"),
 | |
|         (id: "A2", name: "A2"),
 | |
|         (id: "A3", name: "A3"),
 | |
|         (id: "WD3", name: "WD3"),
 | |
|       ),
 | |
|       north: (
 | |
|         (id: "CLK", clock: true),
 | |
|         (id: "WE3", name: "WE3", vertical: true)
 | |
|       ),
 | |
|       east: (
 | |
|         (id: "RD1", name: "RD1"),
 | |
|         (id: "RD2", name: "RD2"),
 | |
|       )
 | |
|     ),
 | |
|     ports-margins: (
 | |
|       east: (20%, 20%)
 | |
|     )
 | |
|   )
 | |
|   wire.stub("RegFile-port-CLK", "north", name: "CLK")
 | |
|   wire.stub("RegFile-port-WE3", "north", name: "Regwrite", vertical: true)
 | |
|   wire.stub("RegFile-port-A2", "west")
 | |
|   wire.stub("RegFile-port-RD2", "east")
 | |
| 
 | |
|   element.extender(
 | |
|     x: (rel: 0, to: "RegFile.west"),
 | |
|     y: -3.5,
 | |
|     w: 3, h: 1,
 | |
|     id: "Extender",
 | |
|     fill: util.colors.green
 | |
|   )
 | |
|   wire.wire(
 | |
|     "wExtender-ImmSrc", (
 | |
|       "Extender.north",
 | |
|       (18, -2)
 | |
|     ),
 | |
|     style: "zigzag",
 | |
|     zigzag-ratio: 0%,
 | |
|     name: "ImmSrc",
 | |
|     name-pos: "end",
 | |
|     bus: true
 | |
|   )
 | |
| 
 | |
|   let mid = ("InstDataMgr.east", 50%, "RegFile.west")
 | |
|   wire.wire(
 | |
|     "wInstDataMgr-Bus", (
 | |
|       "InstDataMgr-port-Instr",
 | |
|       (vertical: (), horizontal: mid)
 | |
|     ),
 | |
|     name: "Instr",
 | |
|     name-pos: "start",
 | |
|     bus: true
 | |
|   )
 | |
|   wire.wire(
 | |
|     "wBus", (
 | |
|       (v => (v.at(0), -3.5), mid),
 | |
|       (horizontal: (), vertical: (0, 3.5)),
 | |
|     ),
 | |
|     bus: true
 | |
|   )
 | |
|   wire.wire(
 | |
|     "wBus-RegFile-A1", (
 | |
|       "RegFile-port-A1",
 | |
|       (horizontal: mid, vertical: ()),
 | |
|     ),
 | |
|     name: "RS1",
 | |
|     name-pos: "end",
 | |
|     slice: (19, 15),
 | |
|     reverse: true,
 | |
|     bus: true
 | |
|   )
 | |
|   wire.wire(
 | |
|     "wBus-RegFile-A3", (
 | |
|       "RegFile-port-A3",
 | |
|       (horizontal: mid, vertical: ()),
 | |
|     ),
 | |
|     name: "RD",
 | |
|     name-pos: "end",
 | |
|     slice: (11, 7),
 | |
|     reverse: true,
 | |
|     bus: true
 | |
|   )
 | |
|   wire.wire(
 | |
|     "wBus-Extender", (
 | |
|       "Extender-port-in",
 | |
|       (horizontal: mid, vertical: ()),
 | |
|     ),
 | |
|     slice: (31, 7),
 | |
|     reverse: true,
 | |
|     bus: true
 | |
|   )
 | |
| 
 | |
|   element.alu(
 | |
|     x: (rel: 4, to: "RegFile.east"),
 | |
|     y: (from: "RegFile-port-RD1", to: "in1"),
 | |
|     w: 1, h: 2,
 | |
|     id: "ALU",
 | |
|     fill: util.colors.purple
 | |
|   )
 | |
|   wire.wire(
 | |
|     "wRegFile-ALU", (
 | |
|       "RegFile-port-RD1",
 | |
|       "ALU-port-in1"
 | |
|     ),
 | |
|     name: ("A", "SrcA"),
 | |
|     bus: true
 | |
|   )
 | |
| 
 | |
|   element.block(
 | |
|     x: (rel: 3, to: "ALU.east"),
 | |
|     y: (from: "ALU-port-out", to: "in"),
 | |
|     w: 1.5, h: 2,
 | |
|     id: "OutBuf",
 | |
|     fill: util.colors.orange,
 | |
|     ports: (
 | |
|       west: (
 | |
|         (id: "in"),
 | |
|       ),
 | |
|       north: (
 | |
|         (id: "CLK", clock: true),
 | |
|       ),
 | |
|       east: (
 | |
|         (id: "out"),
 | |
|       )
 | |
|     )
 | |
|   )
 | |
|   wire.stub("OutBuf-port-CLK", "north", name: "CLK")
 | |
|   wire.wire(
 | |
|     "wALU-OutBuf", (
 | |
|       "ALU-port-out",
 | |
|       "OutBuf-port-in"
 | |
|     ),
 | |
|     name: "ALUResult",
 | |
|     bus: true
 | |
|   )
 | |
| 
 | |
|   element.multiplexer(
 | |
|     x: (rel: 2.5, to: "OutBuf.east"),
 | |
|     y: (from: "OutBuf-port-out", to: "in0"),
 | |
|     w: 1, h: 2.5,
 | |
|     id: "Res-MP",
 | |
|     fill: util.colors.orange,
 | |
|     entries: 3
 | |
|   )
 | |
|   wire.stub("Res-MP.north", "north", name: "ResultSrc")
 | |
|   wire.stub("Res-MP-port-in2", "west")
 | |
|   wire.wire(
 | |
|     "wOutBuf-ResMP", (
 | |
|       "OutBuf-port-out",
 | |
|       "Res-MP-port-in0"
 | |
|     ),
 | |
|     name: "ALUOut",
 | |
|     bus: true
 | |
|   )
 | |
| 
 | |
|   wire.wire(
 | |
|     "wExt-ALU", (
 | |
|       "Extender-port-out",
 | |
|       "ALU-port-in2",
 | |
|     ),
 | |
|     name: ("ImmExt", "SrcB"),
 | |
|     bus: true,
 | |
|     style: "zigzag",
 | |
|     zigzag-ratio: 60%
 | |
|   )
 | |
| 
 | |
|   wire.wire(
 | |
|     "wInstDataMgr-ResMP", (
 | |
|       "InstDataMgr-port-RD",
 | |
|       "Res-MP-port-in1"
 | |
|     ),
 | |
|     style: "dodge",
 | |
|     dodge-y: -4,
 | |
|     dodge-sides: ("east", "west"),
 | |
|     name: "Data",
 | |
|     name-pos: "start",
 | |
|     bus: true
 | |
|   )
 | |
| 
 | |
|   wire.wire(
 | |
|     "wResMP-AdrSrc", (
 | |
|       "Res-MP-port-out",
 | |
|       "AdrSrc-MP-port-in1"
 | |
|     ),
 | |
|     style: "dodge",
 | |
|     dodge-y: -5,
 | |
|     dodge-sides: ("east", "west"),
 | |
|     dodge-margins: (0.5, 1),
 | |
|     bus: true
 | |
|   )
 | |
| 
 | |
|   wire.wire(
 | |
|     "wResMP-RegFile", (
 | |
|       "Res-MP-port-out",
 | |
|       "RegFile-port-WD3"
 | |
|     ),
 | |
|     style: "dodge",
 | |
|     dodge-y: -5,
 | |
|     dodge-sides: ("east", "west"),
 | |
|     dodge-margins: (0.5, 1),
 | |
|     bus: true
 | |
|   )
 | |
| 
 | |
|   wire.wire(
 | |
|     "wResMP-PCBuf", (
 | |
|       "Res-MP-port-out",
 | |
|       "PCBuf-port-PCNext"
 | |
|     ),
 | |
|     style: "dodge",
 | |
|     dodge-y: -5,
 | |
|     dodge-sides: ("east", "west"),
 | |
|     dodge-margins: (0.5, 1.5),
 | |
|     name: "PCNext",
 | |
|     name-pos: "end",
 | |
|     bus: true
 | |
|   )
 | |
|   
 | |
|   wire.intersection("wResMP-RegFile.dodge-end")
 | |
|   wire.intersection("wResMP-AdrSrc.dodge-end")
 | |
| }) |