forked from HEL/circuiteria
		
	
		
			
				
	
	
		
			222 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Typst
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Typst
		
	
	
	
	
	
| #import "@preview/cetz:0.2.2": draw
 | |
| #import "../src/lib.typ": *
 | |
| 
 | |
| #set page(width: auto, height: auto, margin: .5cm)
 | |
| 
 | |
| #circuit({
 | |
|   element.group(id: "toplvl", name: "Toplevel", {
 | |
|     element.group(
 | |
|       id: "proc",
 | |
|       name: "Processor",
 | |
|       padding: 1.5em,
 | |
|       stroke: (dash: "dashed"),
 | |
|       {
 | |
|       element.block(
 | |
|         x: 0, y: 0, w: 8, h: 4,
 | |
|         id: "dp",
 | |
|         fill: util.colors.pink,
 | |
|         name: "Datapath",
 | |
|         ports: (
 | |
|           north: (
 | |
|             (id: "clk", clock: true, small: true),
 | |
|             (id: "Zero"),
 | |
|             (id: "Regsrc"),
 | |
|             (id: "PCSrc"),
 | |
|             (id: "ResultSrc"),
 | |
|             (id: "ALUControl"),
 | |
|             (id: "ImmSrc"),
 | |
|             (id: "RegWrite"),
 | |
|             (id: "dummy")
 | |
|           ),
 | |
|           east: (
 | |
|             (id: "PC", name: "PC"),
 | |
|             (id: "Instr", name: "Instr"),
 | |
|             (id: "ALUResult", name: "ALUResult"),
 | |
|             (id: "dummy"),
 | |
|             (id: "WriteData", name: "WriteData"),
 | |
|             (id: "ReadData", name: "ReadData"),
 | |
|           ),
 | |
|           west: (
 | |
|             (id: "rst"),
 | |
|           )
 | |
|         ),
 | |
|         ports-margins: (
 | |
|           north: (0%, 0%),
 | |
|           west: (0%, 70%)
 | |
|         )
 | |
|       )
 | |
|       
 | |
|       element.block(
 | |
|         x: 0, y: 7, w: 8, h: 3,
 | |
|         id: "ctrl",
 | |
|         fill: util.colors.orange,
 | |
|         name: "Controller",
 | |
|         ports: (
 | |
|           east: (
 | |
|             (id: "Instr", name: "Instr"),
 | |
|           ),
 | |
|           south: (
 | |
|             (id: "dummy"),
 | |
|             (id: "Zero"),
 | |
|             (id: "Regsrc"),
 | |
|             (id: "PCSrc"),
 | |
|             (id: "ResultSrc"),
 | |
|             (id: "ALUControl"),
 | |
|             (id: "ImmSrc"),
 | |
|             (id: "RegWrite"),
 | |
|             (id: "MemWrite")
 | |
|           )
 | |
|         ),
 | |
|         ports-margins: (
 | |
|           south: (0%, 0%)
 | |
|         )
 | |
|       )
 | |
|       wire.wire(
 | |
|         "w-Zero",
 | |
|         ("dp-port-Zero", "ctrl-port-Zero"),
 | |
|         name: "Zero",
 | |
|         name-pos: "start",
 | |
|         directed: true
 | |
|       )
 | |
|       for p in ("Regsrc", "PCSrc", "ResultSrc", "ALUControl", "ImmSrc", "RegWrite") {
 | |
|         wire.wire(
 | |
|           "w-" + p,
 | |
|           ("ctrl-port-"+p, "dp-port-"+p),
 | |
|           name: p,
 | |
|           name-pos: "start",
 | |
|           directed: true
 | |
|         )
 | |
|       }
 | |
| 
 | |
|       draw.content(
 | |
|         (rel: (0, 1em), to: "ctrl.north"),
 | |
|         [*RISCV single*],
 | |
|         anchor: "south"
 | |
|       )
 | |
|     })
 | |
|     
 | |
|     element.block(
 | |
|       x: (rel: 3.5, to: "dp.east"),
 | |
|       y: (from: "dp-port-ReadData", to: "RD"),
 | |
|       w: 3, h: 4,
 | |
|       id: "dmem",
 | |
|       fill: util.colors.green,
 | |
|       name: "Data\n Memory",
 | |
|       ports: (
 | |
|         north: (
 | |
|           (id: "clk", clock: true, small: true),
 | |
|           (id: "WE", name: "WE")
 | |
|         ),
 | |
|         west: (
 | |
|           (id: "dummy"),
 | |
|           (id: "dummy"),
 | |
|           (id: "A", name: "A"),
 | |
|           (id: "dummy"),
 | |
|           (id: "WD", name: "WD"),
 | |
|           (id: "RD", name: "RD"),
 | |
|         )
 | |
|       ),
 | |
|       ports-margins: (
 | |
|         north: (0%, 10%)
 | |
|       )
 | |
|     )
 | |
|     wire.wire(
 | |
|       "w-DataAddr",
 | |
|       ("dp-port-ALUResult", "dmem-port-A"),
 | |
|       name: "DataAddr",
 | |
|       name-pos: "end",
 | |
|       directed: true
 | |
|     )
 | |
|     wire.wire(
 | |
|       "w-WriteData",
 | |
|       ("dp-port-WriteData", "dmem-port-WD"),
 | |
|       name: "WriteData",
 | |
|       name-pos: "end",
 | |
|       directed: true
 | |
|     )
 | |
|     wire.wire(
 | |
|       "w-ReadData",
 | |
|       ("dmem-port-RD", "dp-port-ReadData"),
 | |
|       name: "ReadData",
 | |
|       name-pos: "end",
 | |
|       reverse: true,
 | |
|       directed: true
 | |
|     )
 | |
|     wire.wire(
 | |
|       "w-MemWrite",
 | |
|       ("ctrl-port-MemWrite", "dmem-port-WE"),
 | |
|       style: "zigzag",
 | |
|       name: "MemWrite",
 | |
|       name-pos: "start",
 | |
|       zigzag-dir: "horizontal",
 | |
|       zigzag-ratio: 80%,
 | |
|       directed: true
 | |
|     )
 | |
|     wire.stub(
 | |
|       "dmem-port-clk", "north",
 | |
|       name: "clk", length: 3pt
 | |
|     )
 | |
| 
 | |
|     element.block(
 | |
|       x: (rel: 3.5, to: "dp.east"),
 | |
|       y: (from: "ctrl-port-Instr", to: "dummy"),
 | |
|       w: 3, h: 4,
 | |
|       id: "imem",
 | |
|       fill: util.colors.green,
 | |
|       name: "Instruction\n Memory",
 | |
|       ports: (
 | |
|         west: (
 | |
|           (id: "A", name: "A"),
 | |
|           (id: "dummy"),
 | |
|           (id: "dummy2"),
 | |
|           (id: "RD", name: "RD"),
 | |
|         )
 | |
|       )
 | |
|     )
 | |
|     wire.wire(
 | |
|       "w-PC",
 | |
|       ("dp-port-PC", "imem-port-A"),
 | |
|       style: "zigzag",
 | |
|       directed: true
 | |
|     )
 | |
|     wire.wire(
 | |
|       "w-Instr1",
 | |
|       ("imem-port-RD", "dp-port-Instr"),
 | |
|       style: "zigzag",
 | |
|       zigzag-ratio: 30%,
 | |
|       directed: true
 | |
|     )
 | |
|     wire.wire(
 | |
|       "w-Instr2",
 | |
|       ("imem-port-RD", "ctrl-port-Instr"),
 | |
|       style: "zigzag",
 | |
|       zigzag-ratio: 30%,
 | |
|       directed: true
 | |
|     )
 | |
|     wire.intersection("w-Instr1.zig", radius: 2pt)
 | |
|     draw.content("w-Instr1.zig", "Instr", anchor: "south", padding: 4pt)
 | |
|     draw.content("w-PC.zig", "PC", anchor: "south-east", padding: 2pt)
 | |
| 
 | |
|     draw.content("dmem.south-west", [*External Memories*], anchor: "north", padding: 10pt)
 | |
|   })
 | |
| 
 | |
|   draw.line(name: "w-dp-clk",
 | |
|     "dp-port-clk",
 | |
|     (rel: (0, .5), to: ()),
 | |
|     (
 | |
|       rel: (-.5, 0),
 | |
|       to: (horizontal: "toplvl.west", vertical: ())
 | |
|     )
 | |
|   )
 | |
|   draw.content("w-dp-clk.end", "clk", anchor: "east", padding: 3pt)
 | |
|   
 | |
|   draw.line(name: "w-dp-rst",
 | |
|     "dp-port-rst",
 | |
|     (
 | |
|       rel: (-.5, 0),
 | |
|       to: (horizontal: "toplvl.west", vertical: ())
 | |
|     )
 | |
|   )
 | |
|   draw.content("w-dp-rst.end", "rst", anchor: "east", padding: 3pt)
 | |
| })
 |