3 Commits
Author SHA1 Message Date
David Stadelmann 3076e44207 chore: update minimum compiler version to 0.15.0 2026-07-01 10:39:48 +02:00
David Stadelmann 473dca962f deps: update tidy to 0.4.3 2026-07-01 10:39:18 +02:00
David Stadelmann 9edc60516e deps: update CeTZ 0.3.4 to 0.5.2 with coordinate fixes
CeTZ 0.5.2 requires 3D coordinate vectors (x, y, z) for
coordinate.resolve() and rel-coordinate specs. Update all 2-element
tuples to 3-element tuples and fix .last() to .at(1) for y-component
access on resolved 3D coordinates.
2026-07-01 10:38:39 +02:00
22 changed files with 61 additions and 61 deletions
+7 -7
View File
@@ -3,7 +3,7 @@
Circuiteria is a [Typst](https://typst.app) package for drawing block circuit diagrams using the [CeTZ](https://typst.app/universe/package/cetz) package. Circuiteria is a [Typst](https://typst.app) package for drawing block circuit diagrams using the [CeTZ](https://typst.app/universe/package/cetz) package.
<p align="center"> <p align="center">
<img src="./gallery/platypus.png" alt="A platypus / Perry the Platypus meme made with colored rounded rectangles"> <img src="./gallery/platypus.png" alt="Perry the platypus">
</p> </p>
## Examples ## Examples
@@ -11,17 +11,17 @@ Circuiteria is a [Typst](https://typst.app) package for drawing block circuit di
<tr> <tr>
<td colspan="2"> <td colspan="2">
<a href="./gallery/test.typ"> <a href="./gallery/test.typ">
<img src="./gallery/test.png" width="500px" alt="Block diagram of a multi-cycle RISC-V FPGA processor"> <img src="./gallery/test.png" width="500px">
</a> </a>
</td> </td>
</tr> </tr>
<tr> <tr>
<td colspan="2">A bit of everything</td> <td colspan="2">A bit of eveything</td>
</tr> </tr>
<tr> <tr>
<td colspan="2"> <td colspan="2">
<a href="./gallery/test5.typ"> <a href="./gallery/test5.typ">
<img src="./gallery/test5.png" width="500px" alt="Block diagram of a single-cycle RISC-V processor"> <img src="./gallery/test5.png" width="500px">
</a> </a>
</td> </td>
</tr> </tr>
@@ -31,12 +31,12 @@ Circuiteria is a [Typst](https://typst.app) package for drawing block circuit di
<tr> <tr>
<td> <td>
<a href="./gallery/test4.typ"> <a href="./gallery/test4.typ">
<img src="./gallery/test4.png" width="250px" alt="Top-level block diagram of a single-cycle RISC-V processor"> <img src="./gallery/test4.png" width="250px">
</a> </a>
</td> </td>
<td> <td>
<a href="./gallery/test6.typ"> <a href="./gallery/test6.typ">
<img src="./gallery/test6.png" width="250px" alt="Block diagram of a simple single-cycle RISC-V ALU"> <img src="./gallery/test6.png" width="250px">
</a> </a>
</td> </td>
</tr> </tr>
@@ -56,7 +56,7 @@ For more information, see the [manual](manual.pdf)
To use this package, simply import [circuiteria](https://typst.app/universe/package/circuiteria) and call the `circuit` function: To use this package, simply import [circuiteria](https://typst.app/universe/package/circuiteria) and call the `circuit` function:
```typ ```typ
#import "@preview/circuiteria:0.2.1" #import "@preview/circuiteria:0.2.0"
#circuiteria.circuit({ #circuiteria.circuit({
import circuiteria: * import circuiteria: *
... ...
+1 -1
View File
@@ -1,4 +1,4 @@
#import "@preview/circuiteria:0.2.1": * #import "../src/lib.typ": *
#set page(width: auto, height: auto, margin: .5cm) #set page(width: auto, height: auto, margin: .5cm)
+4 -4
View File
@@ -1,4 +1,4 @@
#import "@preview/circuiteria:0.2.1": circuit, element, util, wire #import "../src/lib.typ": circuit, element, util, wire
#set page(width: auto, height: auto, margin: .5cm) #set page(width: auto, height: auto, margin: .5cm)
@@ -117,7 +117,7 @@
wire.wire( wire.wire(
"wExtender-ImmSrc", ( "wExtender-ImmSrc", (
"Extender.north", "Extender.north",
(18, -2) (18, -2, 0)
), ),
style: "zigzag", style: "zigzag",
zigzag-ratio: 0%, zigzag-ratio: 0%,
@@ -138,8 +138,8 @@
) )
wire.wire( wire.wire(
"wBus", ( "wBus", (
(v => (v.at(0), -3.5), mid), (v => (v.at(0), -3.5, 0), mid),
(horizontal: (), vertical: (0, 3.5)), (horizontal: (), vertical: (0, 3.5, 0)),
), ),
bus: true bus: true
) )
+4 -4
View File
@@ -1,4 +1,4 @@
#import "@preview/circuiteria:0.2.1": circuit, element, util, wire #import "../src/lib.typ": circuit, element, util, wire
#set page(width: auto, height: auto, margin: .5cm) #set page(width: auto, height: auto, margin: .5cm)
@@ -124,7 +124,7 @@
wire.wire( wire.wire(
"wExtender-ImmSrc", ( "wExtender-ImmSrc", (
"Extender.north", "Extender.north",
(18, -2) (18, -2, 0)
), ),
style: "zigzag", style: "zigzag",
zigzag-ratio: 0%, zigzag-ratio: 0%,
@@ -145,8 +145,8 @@
) )
wire.wire( wire.wire(
"wBus", ( "wBus", (
(v => (v.at(0), -3.5), mid), (v => (v.at(0), -3.5, 0), mid),
(horizontal: (), vertical: (0, 3.5)), (horizontal: (), vertical: (0, 3.5, 0)),
), ),
bus: true bus: true
) )
+1 -1
View File
@@ -1,4 +1,4 @@
#import "@preview/circuiteria:0.2.1": circuit, element, util, wire #import "../src/lib.typ": circuit, element, util, wire
#set page(width: auto, height: auto, margin: .5cm) #set page(width: auto, height: auto, margin: .5cm)
+1 -1
View File
@@ -1,5 +1,5 @@
#import "/src/cetz.typ": draw #import "/src/cetz.typ": draw
#import "@preview/circuiteria:0.2.1": * #import "../src/lib.typ": *
#set page(width: auto, height: auto, margin: .5cm) #set page(width: auto, height: auto, margin: .5cm)
+1 -1
View File
@@ -1,5 +1,5 @@
#import "/src/cetz.typ": draw #import "/src/cetz.typ": draw
#import "@preview/circuiteria:0.2.1": * #import "../src/lib.typ": *
#set page(width: auto, height: auto, margin: .5cm) #set page(width: auto, height: auto, margin: .5cm)
+1 -1
View File
@@ -1,5 +1,5 @@
#import "/src/cetz.typ": draw #import "/src/cetz.typ": draw
#import "@preview/circuiteria:0.2.1": * #import "../src/lib.typ": *
#set page(width: auto, height: auto, margin: .5cm) #set page(width: auto, height: auto, margin: .5cm)
+1 -1
View File
@@ -1,4 +1,4 @@
#import "@preview/circuiteria:0.2.1": circuit, element, util, wire #import "../src/lib.typ": circuit, element, util, wire
#set page(width: auto, height: auto, margin: .5cm) #set page(width: auto, height: auto, margin: .5cm)
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -1,4 +1,4 @@
#import "@preview/tidy:0.4.1" #import "@preview/tidy:0.4.3"
#import "/src/cetz.typ": draw, canvas #import "/src/cetz.typ": draw, canvas
#import "src/lib.typ" #import "src/lib.typ"
#import "doc/examples.typ" #import "doc/examples.typ"
@@ -105,7 +105,7 @@ This package provides a way to make beautiful block circuit diagrams using the C
Simply import Circuiteria and call the `circuit` function: Simply import Circuiteria and call the `circuit` function:
#pad(left: 1em)[```typ #pad(left: 1em)[```typ
#import "@preview/circuiteria:0.2.1" #import "@preview/circuiteria:0.2.0"
#circuiteria.circuit({ #circuiteria.circuit({
import circuiteria: * import circuiteria: *
... ...
+1 -1
View File
@@ -1 +1 @@
#import "@preview/cetz:0.3.4": * #import "@preview/cetz:0.5.2": *
+1 -1
View File
@@ -1,5 +1,5 @@
#import "/src/cetz.typ": canvas #import "/src/cetz.typ": canvas
#import "@preview/tidy:0.3.0" #import "@preview/tidy:0.4.3"
/// Draws a block circuit diagram /// Draws a block circuit diagram
/// ///
+1 -1
View File
@@ -76,7 +76,7 @@
if (type(x) == dictionary) { if (type(x) == dictionary) {
let offset = x.rel let offset = x.rel
let to = x.to let to = x.to
let (ctx, to-pos) = coordinate.resolve(ctx, (rel: (offset, 0), to: to)) let (ctx, to-pos) = coordinate.resolve(ctx, (rel: (offset, 0, 0), to: to))
x = to-pos.at(0) x = to-pos.at(0)
} }
+1 -1
View File
@@ -91,7 +91,7 @@
debug: debug debug: debug
) )
let in-pos = (rel: (0, h * (h-ratio / 200%)), to: id+".south-west") let in-pos = (rel: (0, h * (h-ratio / 200%), 0), to: id+".south-west")
let out-pos = (id+".south-east", out-pct, id+".north-east") let out-pos = (id+".south-east", out-pct, id+".north-east")
add-port(id, "west", ports.west.first(), in-pos) add-port(id, "west", ports.west.first(), in-pos)
add-port(id, "east", ports.east.first(), out-pos) add-port(id, "east", ports.east.first(), out-pos)
+2 -2
View File
@@ -61,8 +61,8 @@
draw.hide(draw.group(name: id+"-inner", body)) draw.hide(draw.group(name: id+"-inner", body))
draw.rect( draw.rect(
(rel: (-pad-left, -pad-bottom), to: id+"-inner.south-west"), (rel: (-pad-left, -pad-bottom, 0), to: id+"-inner.south-west"),
(rel: (pad-right, pad-top), to: id+"-inner.north-east"), (rel: (pad-right, pad-top, 0), to: id+"-inner.north-east"),
name: id, name: id,
radius: radius, radius: radius,
stroke: stroke, stroke: stroke,
+3 -3
View File
@@ -51,7 +51,7 @@
if (type(x) == dictionary) { if (type(x) == dictionary) {
let offset = x.rel let offset = x.rel
let to = x.to let to = x.to
let (ctx, to-pos) = coordinate.resolve(ctx, (rel: (offset, 0), to: to)) let (ctx, to-pos) = coordinate.resolve(ctx, (rel: (offset, 0, 0), to: to))
x = to-pos.at(0) x = to-pos.at(0)
} }
@@ -101,7 +101,7 @@
let port-pos = int-name + ".0" let port-pos = int-name + ".0"
if inverted == "all" or port-name in inverted { if inverted == "all" or port-name in inverted {
draw.circle(port-pos, radius: inverted-radius, anchor: "east", stroke: stroke) draw.circle(port-pos, radius: inverted-radius, anchor: "east", stroke: stroke)
port-pos = (rel: (-2 * inverted-radius, 0), to: port-pos) port-pos = (rel: (-2 * inverted-radius, 0, 0), to: port-pos)
} }
add-port( add-port(
id, "west", id, "west",
@@ -113,7 +113,7 @@
let out-pos = id + ".east" let out-pos = id + ".east"
if inverted == "all" or "out" in inverted { if inverted == "all" or "out" in inverted {
draw.circle(out-pos, radius: inverted-radius, anchor: "west", stroke: stroke) draw.circle(out-pos, radius: inverted-radius, anchor: "west", stroke: stroke)
out-pos = (rel: (2 * inverted-radius, 0), to: out-pos) out-pos = (rel: (2 * inverted-radius, 0, 0), to: out-pos)
} }
add-port( add-port(
id, "east", id, "east",
+3 -3
View File
@@ -62,7 +62,7 @@
if (type(x) == dictionary) { if (type(x) == dictionary) {
let offset = x.rel let offset = x.rel
let to = x.to let to = x.to
let (ctx, to-pos) = coordinate.resolve(ctx, (rel: (offset, 0), to: to)) let (ctx, to-pos) = coordinate.resolve(ctx, (rel: (offset, 0, 0), to: to))
x = to-pos.at(0) x = to-pos.at(0)
} }
@@ -103,7 +103,7 @@
anchor: "east", anchor: "east",
stroke: stroke stroke: stroke
) )
port-pos = (rel: (-2 * inverted-radius, 0), to: port-pos) port-pos = (rel: (-2 * inverted-radius, 0, 0), to: port-pos)
} }
add-port( add-port(
id, "west", id, "west",
@@ -115,7 +115,7 @@
let out-pos = id + ".east" let out-pos = id + ".east"
if inverted == "all" or "out" in inverted { if inverted == "all" or "out" in inverted {
draw.circle(out-pos, radius: inverted-radius, anchor: "west", stroke: stroke) draw.circle(out-pos, radius: inverted-radius, anchor: "west", stroke: stroke)
out-pos = (rel: (2 * inverted-radius, 0), to: out-pos) out-pos = (rel: (2 * inverted-radius, 0, 0), to: out-pos)
} }
add-port( add-port(
id, "east", id, "east",
+4 -4
View File
@@ -17,10 +17,10 @@
let size = if port.at("small", default: false) {8pt} else {1em} let size = if port.at("small", default: false) {8pt} else {1em}
let offset let offset
if (side == "north") { offset = ( 0, -size) } if (side == "north") { offset = ( 0, -size, 0) }
else if (side == "east") { offset = (-size, 0) } else if (side == "east") { offset = (-size, 0, 0) }
else if (side == "south") { offset = ( 0, size) } else if (side == "south") { offset = ( 0, size, 0) }
else if (side == "west") { offset = ( size, 0) } else if (side == "west") { offset = ( size, 0, 0) }
let pos1 = (rel: offset, to: pos) let pos1 = (rel: offset, to: pos)
+1 -1
View File
@@ -1,4 +1,4 @@
#let version = version(0, 2, 1) #let version = version(0, 2, 0)
#let name = "circuiteria" #let name = "circuiteria"
#import "circuit.typ": circuit #import "circuit.typ": circuit
+18 -18
View File
@@ -68,8 +68,8 @@
let (ctx, p0) = coordinate.resolve(ctx, start) let (ctx, p0) = coordinate.resolve(ctx, start)
let (ctx, p3) = coordinate.resolve(ctx, end) let (ctx, p3) = coordinate.resolve(ctx, end)
p0 = (x: p0.first(), y: p0.last()) p0 = (x: p0.first(), y: p0.at(1))
p3 = (x: p3.first(), y: p3.last()) p3 = (x: p3.first(), y: p3.at(1))
let dx1 = margin-start let dx1 = margin-start
let dx2 = margin-end let dx2 = margin-end
@@ -86,13 +86,13 @@
if side-end == "east" { if side-end == "east" {
dx2 *= -1 dx2 *= -1
} }
p1 = (p0.x + dx1, p0.y) p1 = (p0.x + dx1, p0.y, 0)
p2 = (p3.x - dx2, p0.y) p2 = (p3.x - dx2, p0.y, 0)
let points = ( let points = (
start, start,
(horizontal: p1, vertical: ()), (horizontal: p1, vertical: ()),
(horizontal: (), vertical: (0, dodge-y)), (horizontal: (), vertical: (0, dodge-y, 0)),
(horizontal: p2, vertical: ()), (horizontal: p2, vertical: ()),
(horizontal: (), vertical: end), (horizontal: (), vertical: end),
end end
@@ -147,18 +147,18 @@
// points that are closest to the edge points // points that are closest to the edge points
let p1 = (p0.x + dx1, p0.y + dy1) let p1 = (p0.x + dx1, p0.y + dy1, 0)
let p5 = (p6.x + dx2, p6.y + dy2) let p5 = (p6.x + dx2, p6.y + dy2, 0)
// middle point // middle point
let center_x = p0.x + box_width * center_horizontal / 100% let center_x = p0.x + box_width * center_horizontal / 100%
let center_y = p0.y + box_height * center_vertical / 100% let center_y = p0.y + box_height * center_vertical / 100%
let p3 = (center_x, center_y) let p3 = (center_x, center_y, 0)
// setting up the points for that touch the guides // setting up the points for that touch the guides
let p2 = (0,0) let p2 = (0,0,0)
let p4 = (0,0) let p4 = (0,0,0)
if side-start in ("north", "south") { if side-start in ("north", "south") {
p2 = (horizontal: p3, vertical: p1) p2 = (horizontal: p3, vertical: p1)
} else { } else {
@@ -365,17 +365,17 @@
/// - name-offset (number): The name offset, perpendicular to the stub /// - name-offset (number): The name offset, perpendicular to the stub
#let stub(port-id, side, name: none, vertical: false, length: 1em, name-offset: 0) = { #let stub(port-id, side, name: none, vertical: false, length: 1em, name-offset: 0) = {
let end-offset = ( let end-offset = (
north: (0, length), north: (0, length, 0),
east: (length, 0), east: (length, 0, 0),
south: (0, -length), south: (0, -length, 0),
west: (-length, 0) west: (-length, 0, 0)
).at(side) ).at(side)
let name-offset = ( let name-offset = (
north: (name-offset, length), north: (name-offset, length, 0),
east: (length, name-offset), east: (length, name-offset, 0),
south: (name-offset, -length), south: (name-offset, -length, 0),
west: (-length, name-offset) west: (-length, name-offset, 0)
).at(side) ).at(side)
draw.line( draw.line(
+3 -3
View File
@@ -1,7 +1,7 @@
[package] [package]
name = "circuiteria" name = "circuiteria"
version = "0.2.1" version = "0.2.0"
compiler = "0.13.1" compiler = "0.15.0"
repository = "https://git.kb28.ch/HEL/circuiteria" repository = "https://git.kb28.ch/HEL/circuiteria"
entrypoint = "src/lib.typ" entrypoint = "src/lib.typ"
authors = [ authors = [
@@ -9,6 +9,6 @@ authors = [
] ]
categories = [ "visualization" ] categories = [ "visualization" ]
license = "Apache-2.0" license = "Apache-2.0"
description = "Drawing block circuits made easy, using CeTZ" description = "Drawing block circuits with Typst made easy, using CeTZ"
keywords = [ "circuit", "block", "draw" ] keywords = [ "circuit", "block", "draw" ]
exclude = [ "gallery", "justfile", "doc" ] exclude = [ "gallery", "justfile", "doc" ]