forked from HEL/circuiteria
71 lines
1.2 KiB
Typst
71 lines
1.2 KiB
Typst
#import "/src/cetz.typ": draw
|
|
#import "element.typ"
|
|
#import "ports.typ": add-port
|
|
#import "../util.typ"
|
|
|
|
#let draw-shape(elmt, bounds) = {
|
|
let tl = bounds.tl
|
|
let tr = bounds.tr
|
|
let bl = bounds.bl
|
|
let br = bounds.br
|
|
|
|
let p0 = tl
|
|
let p1 = util.lerp(tr, 10%, br)
|
|
let p2 = util.lerp(tr, 90%, br)
|
|
let p3 = bl
|
|
let p4 = util.lerp(tl, 55%, bl)
|
|
let p5 = util.lerp(tl, 50%, br)
|
|
let p6 = util.lerp(tl, 45%, bl)
|
|
|
|
let bounds2 = element.complete-bounds(elmt, (
|
|
tl: p0,
|
|
tr: p1,
|
|
br: p2,
|
|
bl: p3
|
|
))
|
|
|
|
let f = {
|
|
draw.line(
|
|
p0, p1, p2, p3, p4, p5, p6,
|
|
fill: elmt.fill,
|
|
stroke: elmt.stroke,
|
|
close: true
|
|
)
|
|
draw.anchor("name", (p5, 50%, (p1, 50%, p2)))
|
|
}
|
|
|
|
return (f, bounds2)
|
|
}
|
|
|
|
/// Draws an ALU with two inputs
|
|
///
|
|
/// #examples.alu
|
|
/// For parameters description, see #doc-ref("element.elmt")
|
|
#let alu(
|
|
..args
|
|
) = {
|
|
let ports = (
|
|
west: (
|
|
(id: "in1"),
|
|
(id: "in2"),
|
|
),
|
|
east: (
|
|
(id: "out"),
|
|
)
|
|
)
|
|
|
|
return element.elmt(
|
|
draw-shape: draw-shape,
|
|
ports: ports,
|
|
ports-pos: (
|
|
west: (
|
|
in1: l => l * 0.225,
|
|
in2: l => l * 0.775,
|
|
),
|
|
east: (
|
|
out: l => l * 0.5
|
|
)
|
|
),
|
|
..args
|
|
)
|
|
} |