Files
circuiteria/src/elements/alu.typ

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
)
}