diff --git a/gallery/target_api.pdf b/gallery/target_api.pdf index d1a9600..e0ecee5 100644 Binary files a/gallery/target_api.pdf and b/gallery/target_api.pdf differ diff --git a/gallery/target_api.typ b/gallery/target_api.typ index b856434..87df0b3 100644 --- a/gallery/target_api.typ +++ b/gallery/target_api.typ @@ -1,5 +1,8 @@ #import "../src/lib.typ": * #import "@preview/cetz:0.3.4": draw + +#set text(font: "Source Sans 3") + #circuit({ element.block( size: (1.5, 2.2), @@ -10,14 +13,12 @@ north: (id: "CLK", clock: true), east: "PC", south: (("EN", "EN"),) - ), - debug: (ports: true) + ) ) wire.stub("PCBuf.CLK", name: "CLK") wire.stub("PCBuf.EN", name: "PCWrite") - element.multiplexer( pos: ( 3, (align: "in0", with: "PCBuf.PC") @@ -25,18 +26,18 @@ size: (1, 2), id: "AdrSrc-MP", fill: util.colors.orange, - entries: 2, - debug: (ports: true) + entries: 2 ) - /*wire.wire( + wire.wire( "PCBuf.PC", "AdrSrc-MP.in0", id: "wPCBuf-InstDataMgr", name: "PC", bus: true ) - wire.stub("AdrSrc-MP.north", name: "AdrSrc") + wire.stub("AdrSrc-MP.north", side: "north", name: "AdrSrc") + /* element.block( pos: ( 6, (align: "A", with: "AdrSrc-MP.out") diff --git a/src/elements/element.typ b/src/elements/element.typ index d38a824..51c071b 100644 --- a/src/elements/element.typ +++ b/src/elements/element.typ @@ -116,22 +116,29 @@ return coord } -#let make-bounds(elmt, x, y, w, h) = { - let w2 = w / 2 - let h2 = h / 2 - - let bounds = ( - bl: (x, y), - tl: (x, y + h), - tr: (x + w, y + h), - br: (x + w, y), - center: (x + w2, y + h2), - b: (x + w2, y), - t: (x + w2, y + h), - l: (x, y + h2), - r: (x + w, y + h2), - ) +#let complete-bounds(elmt, bounds) = { + let b = bounds bounds += ( + center: ( + (b.br.at(0) + b.tl.at(0))/2, + (b.br.at(1) + b.tl.at(1))/2 + ), + b: ( + (b.br.at(0) + b.bl.at(0))/2, + (b.br.at(1) + b.bl.at(1))/2 + ), + t: ( + (b.tr.at(0) + b.tl.at(0))/2, + (b.tr.at(1) + b.tl.at(1))/2 + ), + l: ( + (b.bl.at(0) + b.tl.at(0))/2, + (b.bl.at(1) + b.tl.at(1))/2 + ), + r: ( + (b.br.at(0) + b.tr.at(0))/2, + (b.br.at(1) + b.tr.at(1))/2 + ), sides: ( north: (bounds.tl, bounds.tr), south: (bounds.bl, bounds.br), @@ -160,6 +167,19 @@ return bounds } +#let make-bounds(elmt, x, y, w, h) = { + let w2 = w / 2 + let h2 = h / 2 + + let bounds = ( + bl: (x, y), + tl: (x, y + h), + tr: (x + w, y + h), + br: (x + w, y), + ) + return complete-bounds(elmt, bounds) +} + #let render(draw-shape, elmt) = draw.group(name: elmt.id, ctx => { let width = elmt.size.first() let height = elmt.size.last() diff --git a/src/elements/multiplexer.typ b/src/elements/multiplexer.typ index 8e55173..1e4832a 100644 --- a/src/elements/multiplexer.typ +++ b/src/elements/multiplexer.typ @@ -5,27 +5,33 @@ #let draw-shape(elmt, bounds) = { let margin = (100% - elmt.l-ratio) / 2 - let tr2 = (bounds.tr, margin, bounds.br) - let br2 = (bounds.br, margin, bounds.tr) - let f = draw.group(name: elmt.id, { + let tr2 = util.lerp(bounds.tr, margin, bounds.br) + let br2 = util.lerp(bounds.br, margin, bounds.tr) + let bounds2 = element.complete-bounds(elmt, ( + tl: bounds.tl, + bl: bounds.bl, + tr: tr2, + br: br2, + )) + let f = { draw.merge-path( inset: 0.5em, fill: elmt.fill, stroke: elmt.stroke, close: true, - draw.line(bounds.tl, tr2, br2, bounds.bl) + draw.line(bounds2.tl, bounds2.tr, bounds2.br, bounds2.bl) ) - draw.anchor("north", (bounds.tl, 50%, tr2)) - draw.anchor("south", (bounds.bl, 50%, br2)) - draw.anchor("west", (bounds.tl, 50%, bounds.bl)) - draw.anchor("east", (tr2, 50%, br2)) - draw.anchor("north-west", bounds.tl) - draw.anchor("north-east", tr2) - draw.anchor("south-east", br2) - draw.anchor("south-west", bounds.bl) - }) + draw.anchor("north", bounds2.t) + draw.anchor("south", bounds2.b) + draw.anchor("west", bounds2.l) + draw.anchor("east", bounds2.r) + draw.anchor("north-west", bounds2.tl) + draw.anchor("north-east", bounds2.tr) + draw.anchor("south-east", bounds2.br) + draw.anchor("south-west", bounds2.bl) + } - return (f, bounds) + return (f, bounds2) } /// Draws a multiplexer diff --git a/src/elements/ports.typ b/src/elements/ports.typ index eecd300..f6bde71 100644 --- a/src/elements/ports.typ +++ b/src/elements/ports.typ @@ -9,7 +9,7 @@ } } } - panic("Unknown port " + port + " on element " + element.id) + panic("Unknown port " + port + " on element " + elmt.id) } #let get-port-idx(elmt, port, side: auto) = { diff --git a/src/util.typ b/src/util.typ index a444434..3d91749 100644 --- a/src/util.typ +++ b/src/util.typ @@ -73,4 +73,11 @@ #let valid-anchors = ( "center", "north", "east", "west", "south", "north-east", "north-west", "south-east", "south-west" -) \ No newline at end of file +) + +#let lerp(pt0, ratio, pt1) = { + return ( + (pt1.at(0) - pt0.at(0)) * ratio / 100% + pt0.at(0), + (pt1.at(1) - pt0.at(1)) * ratio / 100% + pt0.at(1) + ) +} \ No newline at end of file diff --git a/src/wire.typ b/src/wire.typ index 899e4c1..13d6ffb 100644 --- a/src/wire.typ +++ b/src/wire.typ @@ -130,10 +130,11 @@ /// - dodge-sides (array): The start and end sides (going out of the connected element) of the wire (only with style "dodge") /// - dodge-margins (array): The start and end margins (i.e. space before dodging) of the wire (only with style "dodge") #let wire( - id, pts, + pt0, + pt1, + id: none, bus: false, name: none, - name-pos: "middle", slice: none, color: black, dashed: false, @@ -145,15 +146,14 @@ zigzag-dir: "vertical", dodge-y: 0, dodge-sides: ("east", "west"), - dodge-margins: (5%, 5%) + dodge-margins: (5%, 5%), + ..args ) = draw.get-ctx(ctx => { if not style in wire-styles { panic("Invalid wire style '" + style + "'") } - if pts.len() != 2 { - panic("Wrong number of points (got " + str(pts.len()) + " instead of 2)") - } + let pts = (pt0, pt1) let stroke = ( paint: color, @@ -218,7 +218,7 @@ let names = () if type(name) == str { - names = ((name, name-pos),) + names = ((name, "middle"),) } else if type(name) == array { names = ( @@ -228,6 +228,9 @@ } for (name, pos) in names { + if name == none { + continue + } let point let anchor @@ -269,7 +272,7 @@ /// - vertical (bool): Whether the name should be displayed vertically /// - length (number): The length of the stub /// - name-offset (number): The name offset, perpendicular to the stub -#let stub(anchor, name: none, vertical: false, length: 1em, name-offset: 0) = { +#let stub(anchor, side: auto, name: none, vertical: false, length: 1em, name-offset: 0) = { if "." not in anchor { panic("`anchor` must be a valid anchor of an element") } @@ -280,11 +283,14 @@ let pre-process = (elements, elmt) => { let eid = elmt.id - if port-elmt-id not in elements { - panic("Unknown element " + port-elmt-id) + let side = side + if side == auto { + if port-elmt-id not in elements { + panic("Unknown element " + port-elmt-id) + } + let port-elmt = elements.at(port-elmt-id) + side = get-port-side(port-elmt, port-id) } - let port-elmt = elements.at(port-elmt-id) - let side = get-port-side(port-elmt, port-id) elements.at(eid).insert("side", side) return elements }