forked from HEL/circuiteria
Compare commits
11 Commits
8c91ccdd54
...
dev
Author | SHA1 | Date | |
---|---|---|---|
d73215c889 | |||
87643983ec | |||
94fef0a245 | |||
1a0a659ace | |||
f2ce91ec39 | |||
043bb339fe | |||
693676d61a | |||
94d5d6b854 | |||
71f128f6c9 | |||
ea8277ee5b | |||
c5e4f8039a |
@@ -56,7 +56,7 @@ for i in range(3) {
|
|||||||
```)
|
```)
|
||||||
|
|
||||||
#let wires = example(```
|
#let wires = example(```
|
||||||
for i in range(3) {
|
for i in range(4) {
|
||||||
draw.circle((i * 3, 0), radius: .1, name: "p" + str(i * 2))
|
draw.circle((i * 3, 0), radius: .1, name: "p" + str(i * 2))
|
||||||
draw.circle((i * 3 + 2, 1), radius: .1, name: "p" + str(i * 2 + 1))
|
draw.circle((i * 3 + 2, 1), radius: .1, name: "p" + str(i * 2 + 1))
|
||||||
draw.content((i * 3 + 1, -1), raw(wire.wire-styles.at(i)))
|
draw.content((i * 3 + 1, -1), raw(wire.wire-styles.at(i)))
|
||||||
@@ -65,6 +65,10 @@ wire.wire("w1", ("p0", "p1"), style: "direct")
|
|||||||
wire.wire("w2", ("p2", "p3"), style: "zigzag")
|
wire.wire("w2", ("p2", "p3"), style: "zigzag")
|
||||||
wire.wire("w3", ("p4", "p5"), style: "dodge",
|
wire.wire("w3", ("p4", "p5"), style: "dodge",
|
||||||
dodge-y: -0.5, dodge-margins: (0.5, 0.5))
|
dodge-y: -0.5, dodge-margins: (0.5, 0.5))
|
||||||
|
wire.wire("w4", ("p6","p7"), style: "guided",
|
||||||
|
guided-center:(20%, 40%), guided-margins: (90%,87%),
|
||||||
|
guided-sides: ("north","south"))
|
||||||
|
|
||||||
```, vertical: true)
|
```, vertical: true)
|
||||||
|
|
||||||
#let stub = example(```
|
#let stub = example(```
|
||||||
@@ -115,6 +119,46 @@ gates.gate-xnor(x: 0, y: 0, w: 1.5, h: 1.5)
|
|||||||
gates.gate-xnor(x: 3, y: 0, w: 1.5, h: 1.5, inverted: "all")
|
gates.gate-xnor(x: 3, y: 0, w: 1.5, h: 1.5, inverted: "all")
|
||||||
```, vertical: true)
|
```, vertical: true)
|
||||||
|
|
||||||
|
#let iec-gate-and = example(```
|
||||||
|
gates.iec-gate-and(x: 0, y: 0, w: 1.5, h: 1.5)
|
||||||
|
gates.iec-gate-and(x: 3, y: 0, w: 1.5, h: 1.5, inverted: "all")
|
||||||
|
```, vertical: true)
|
||||||
|
|
||||||
|
#let iec-gate-nand = example(```
|
||||||
|
gates.iec-gate-nand(x: 0, y: 0, w: 1.5, h: 1.5)
|
||||||
|
gates.iec-gate-nand(x: 3, y: 0, w: 1.5, h: 1.5, inverted: "all")
|
||||||
|
```, vertical: true)
|
||||||
|
|
||||||
|
#let iec-gate-or = example(```
|
||||||
|
gates.iec-gate-or(x: 0, y: 0, w: 1.5, h: 1.5)
|
||||||
|
gates.iec-gate-or(x: 3, y: 0, w: 1.5, h: 1.5, inverted: "all")
|
||||||
|
```, vertical: true)
|
||||||
|
|
||||||
|
#let iec-gate-nor = example(```
|
||||||
|
gates.iec-gate-nor(x: 0, y: 0, w: 1.5, h: 1.5)
|
||||||
|
gates.iec-gate-nor(x: 3, y: 0, w: 1.5, h: 1.5, inverted: "all")
|
||||||
|
```, vertical: true)
|
||||||
|
|
||||||
|
#let iec-gate-xor = example(```
|
||||||
|
gates.iec-gate-xor(x: 0, y: 0, w: 1.5, h: 1.5)
|
||||||
|
gates.iec-gate-xor(x: 3, y: 0, w: 1.5, h: 1.5, inverted: "all")
|
||||||
|
```, vertical: true)
|
||||||
|
|
||||||
|
#let iec-gate-xnor = example(```
|
||||||
|
gates.iec-gate-xnor(x: 0, y: 0, w: 1.5, h: 1.5)
|
||||||
|
gates.iec-gate-xnor(x: 3, y: 0, w: 1.5, h: 1.5, inverted: "all")
|
||||||
|
```, vertical: true)
|
||||||
|
|
||||||
|
#let iec-gate-buf = example(```
|
||||||
|
gates.iec-gate-buf(x: 0, y: 0, w: 1.5, h: 1.5)
|
||||||
|
gates.iec-gate-buf(x: 3, y: 0, w: 1.5, h: 1.5, inverted: "all")
|
||||||
|
```, vertical: true)
|
||||||
|
|
||||||
|
#let iec-gate-not = example(```
|
||||||
|
gates.iec-gate-not(x: 0, y: 0, w: 1.5, h: 1.5)
|
||||||
|
gates.iec-gate-not(x: 3, y: 0, w: 1.5, h: 1.5, inverted: "all")
|
||||||
|
```, vertical: true)
|
||||||
|
|
||||||
#let group = example(```
|
#let group = example(```
|
||||||
element.group(
|
element.group(
|
||||||
id: "g1", name: "Group 1", stroke: (dash: "dashed"),
|
id: "g1", name: "Group 1", stroke: (dash: "dashed"),
|
||||||
@@ -147,4 +191,4 @@ wire.wire("w1", ((0, 0), (1, 1)), style: "zigzag")
|
|||||||
wire.wire("w2", ((0, 0), (1, -.5)),
|
wire.wire("w2", ((0, 0), (1, -.5)),
|
||||||
style: "zigzag", zigzag-ratio: 80%)
|
style: "zigzag", zigzag-ratio: 80%)
|
||||||
wire.intersection("w1.zig")
|
wire.intersection("w1.zig")
|
||||||
```)
|
```)
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
#set page(width: auto, height: auto, margin: .5cm)
|
#set page(width: auto, height: auto, margin: .5cm)
|
||||||
|
|
||||||
#circuit({
|
#circuit({
|
||||||
element.gate-iec-buf(
|
element.iec-gate-buf(
|
||||||
x: 0,
|
x: 0,
|
||||||
y: 0,
|
y: 0,
|
||||||
w: 2,
|
w: 2,
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
)
|
)
|
||||||
wire.stub("iec-buf-port-in0", "west")
|
wire.stub("iec-buf-port-in0", "west")
|
||||||
|
|
||||||
element.gate-iec-not(
|
element.iec-gate-not(
|
||||||
x: 3,
|
x: 3,
|
||||||
y: 0,
|
y: 0,
|
||||||
w: 2,
|
w: 2,
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
)
|
)
|
||||||
wire.stub("iec-not-port-in0", "west")
|
wire.stub("iec-not-port-in0", "west")
|
||||||
|
|
||||||
element.gate-iec-and(
|
element.iec-gate-and(
|
||||||
id: "iec-and",
|
id: "iec-and",
|
||||||
x: 0,
|
x: 0,
|
||||||
y: -3,
|
y: -3,
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
wire.stub("iec-and-port-in" + str(i), "west")
|
wire.stub("iec-and-port-in" + str(i), "west")
|
||||||
}
|
}
|
||||||
|
|
||||||
element.gate-iec-nand(
|
element.iec-gate-nand(
|
||||||
id: "iec-nand",
|
id: "iec-nand",
|
||||||
x: 3,
|
x: 3,
|
||||||
y: -3,
|
y: -3,
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
wire.stub("iec-nand-port-in" + str(i), "west")
|
wire.stub("iec-nand-port-in" + str(i), "west")
|
||||||
}
|
}
|
||||||
|
|
||||||
element.gate-iec-or(
|
element.iec-gate-or(
|
||||||
id: "iec-or",
|
id: "iec-or",
|
||||||
x: 0,
|
x: 0,
|
||||||
y: -6,
|
y: -6,
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
wire.stub("iec-or-port-in" + str(i), "west")
|
wire.stub("iec-or-port-in" + str(i), "west")
|
||||||
}
|
}
|
||||||
|
|
||||||
element.gate-iec-nor(
|
element.iec-gate-nor(
|
||||||
id: "iec-nor",
|
id: "iec-nor",
|
||||||
x: 3,
|
x: 3,
|
||||||
y: -6,
|
y: -6,
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
wire.stub("iec-nor-port-in" + str(i), "west")
|
wire.stub("iec-nor-port-in" + str(i), "west")
|
||||||
}
|
}
|
||||||
|
|
||||||
element.gate-iec-xor(
|
element.iec-gate-xor(
|
||||||
id: "iec-xor",
|
id: "iec-xor",
|
||||||
x: 0,
|
x: 0,
|
||||||
y: -9,
|
y: -9,
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
wire.stub("iec-xor-port-in" + str(i), "west")
|
wire.stub("iec-xor-port-in" + str(i), "west")
|
||||||
}
|
}
|
||||||
|
|
||||||
element.gate-iec-nxor(
|
element.iec-gate-xnor(
|
||||||
id: "iec-nxor",
|
id: "iec-nxor",
|
||||||
x: 3,
|
x: 3,
|
||||||
y: -9,
|
y: -9,
|
||||||
|
BIN
manual.pdf
BIN
manual.pdf
Binary file not shown.
@@ -195,7 +195,12 @@ If you have installed Circuiteria directly in your project, import #link("src/li
|
|||||||
read("src/elements/logic/and.typ") + "\n" +
|
read("src/elements/logic/and.typ") + "\n" +
|
||||||
read("src/elements/logic/buf.typ") + "\n" +
|
read("src/elements/logic/buf.typ") + "\n" +
|
||||||
read("src/elements/logic/or.typ") + "\n" +
|
read("src/elements/logic/or.typ") + "\n" +
|
||||||
read("src/elements/logic/xor.typ"),
|
read("src/elements/logic/xor.typ") + "\n" +
|
||||||
|
read("src/elements/logic/iec_gate.typ") + "\n" +
|
||||||
|
read("src/elements/logic/iec_and.typ") + "\n" +
|
||||||
|
read("src/elements/logic/iec_buf.typ") + "\n" +
|
||||||
|
read("src/elements/logic/iec_or.typ") + "\n" +
|
||||||
|
read("src/elements/logic/iec_xor.typ"),
|
||||||
name: "gates",
|
name: "gates",
|
||||||
old-syntax: true,
|
old-syntax: true,
|
||||||
scope: (
|
scope: (
|
||||||
|
@@ -9,6 +9,5 @@
|
|||||||
/// - length (length, ratio): Optional base unit
|
/// - length (length, ratio): Optional base unit
|
||||||
/// -> none
|
/// -> none
|
||||||
#let circuit(body, length: 2em) = {
|
#let circuit(body, length: 2em) = {
|
||||||
set text(font: "Source Sans 3")
|
|
||||||
canvas(length: length, body)
|
canvas(length: length, body)
|
||||||
}
|
}
|
||||||
|
@@ -12,9 +12,9 @@
|
|||||||
#import "elements/logic/xor.typ": gate-xor, gate-xnor
|
#import "elements/logic/xor.typ": gate-xor, gate-xnor
|
||||||
#import "elements/logic/buf.typ": gate-buf, gate-not
|
#import "elements/logic/buf.typ": gate-buf, gate-not
|
||||||
#import "elements/logic/iec_gate.typ": iec-gate
|
#import "elements/logic/iec_gate.typ": iec-gate
|
||||||
#import "elements/logic/iec_and.typ": gate-iec-and, gate-iec-nand
|
#import "elements/logic/iec_and.typ": iec-gate-and, iec-gate-nand
|
||||||
#import "elements/logic/iec_buf.typ": gate-iec-buf, gate-iec-not
|
#import "elements/logic/iec_buf.typ": iec-gate-buf, iec-gate-not
|
||||||
#import "elements/logic/iec_or.typ": gate-iec-or, gate-iec-nor
|
#import "elements/logic/iec_or.typ": iec-gate-or, iec-gate-nor
|
||||||
#import "elements/logic/iec_xor.typ": gate-iec-xor, gate-iec-nxor
|
#import "elements/logic/iec_xor.typ": iec-gate-xor, iec-gate-xnor
|
||||||
|
|
||||||
#import "elements/group.typ": group
|
#import "elements/group.typ": group
|
@@ -1,9 +1,9 @@
|
|||||||
#import "@preview/cetz:0.3.2": draw
|
#import "@preview/cetz:0.3.2": draw
|
||||||
#import "element.typ"
|
#import "element.typ"
|
||||||
|
|
||||||
#let draw-shape(id, tl, tr, br, bl, fill, stroke) = {
|
#let draw-shape(id, tl, tr, br, bl, fill, stroke, radius: 0.5em) = {
|
||||||
let f = draw.rect(
|
let f = draw.rect(
|
||||||
radius: 0.5em,
|
radius: radius,
|
||||||
inset: 0.5em,
|
inset: 0.5em,
|
||||||
fill: fill,
|
fill: fill,
|
||||||
stroke: stroke,
|
stroke: stroke,
|
||||||
@@ -27,13 +27,14 @@
|
|||||||
ports: (),
|
ports: (),
|
||||||
ports-margins: (),
|
ports-margins: (),
|
||||||
fill: none,
|
fill: none,
|
||||||
|
radius: 0.5em,
|
||||||
stroke: black + 1pt,
|
stroke: black + 1pt,
|
||||||
id: "",
|
id: "",
|
||||||
debug: (
|
debug: (
|
||||||
ports: false
|
ports: false
|
||||||
)
|
)
|
||||||
) = element.elmt(
|
) = element.elmt(
|
||||||
draw-shape: draw-shape,
|
draw-shape: draw-shape.with(radius: radius),
|
||||||
x: x,
|
x: x,
|
||||||
y: y,
|
y: y,
|
||||||
w: w,
|
w: w,
|
||||||
@@ -46,4 +47,4 @@
|
|||||||
stroke: stroke,
|
stroke: stroke,
|
||||||
id: id,
|
id: id,
|
||||||
debug: debug
|
debug: debug
|
||||||
)
|
)
|
||||||
|
@@ -6,8 +6,8 @@
|
|||||||
/// Draws an IEC-AND gate. This function is also available as `element.iec-gate-and()`
|
/// Draws an IEC-AND gate. This function is also available as `element.iec-gate-and()`
|
||||||
///
|
///
|
||||||
/// For parameters, see #doc-ref("gates.iec-gate")
|
/// For parameters, see #doc-ref("gates.iec-gate")
|
||||||
/// #examples.gate-iec-and
|
/// #examples.iec-gate-and
|
||||||
#let gate-iec-and(
|
#let iec-gate-and(
|
||||||
x: none,
|
x: none,
|
||||||
y: none,
|
y: none,
|
||||||
w: none,
|
w: none,
|
||||||
@@ -40,8 +40,8 @@
|
|||||||
/// Draws an IEC-NAND gate. This function is also available as `element.iec-gate-nand()`
|
/// Draws an IEC-NAND gate. This function is also available as `element.iec-gate-nand()`
|
||||||
///
|
///
|
||||||
/// For parameters, see #doc-ref("gates.iec-gate")
|
/// For parameters, see #doc-ref("gates.iec-gate")
|
||||||
/// #examples.gate-iec-nand
|
/// #examples.iec-gate-nand
|
||||||
#let gate-iec-nand(
|
#let iec-gate-nand(
|
||||||
x: none,
|
x: none,
|
||||||
y: none,
|
y: none,
|
||||||
w: none,
|
w: none,
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
ports: false
|
ports: false
|
||||||
),
|
),
|
||||||
) = {
|
) = {
|
||||||
gate-iec-and(
|
iec-gate-and(
|
||||||
x: x,
|
x: x,
|
||||||
y: y,
|
y: y,
|
||||||
w: w,
|
w: w,
|
||||||
|
@@ -5,8 +5,8 @@
|
|||||||
/// Draws an IEC buffer gate. This function is also available as `element.iec-gate-buf()`
|
/// Draws an IEC buffer gate. This function is also available as `element.iec-gate-buf()`
|
||||||
///
|
///
|
||||||
/// For parameters, see #doc-ref("gates.iec-gate")
|
/// For parameters, see #doc-ref("gates.iec-gate")
|
||||||
/// #examples.gate-iec-buf
|
/// #examples.iec-gate-buf
|
||||||
#let gate-iec-buf(
|
#let iec-gate-buf(
|
||||||
x: none,
|
x: none,
|
||||||
y: none,
|
y: none,
|
||||||
w: none,
|
w: none,
|
||||||
@@ -38,8 +38,8 @@
|
|||||||
/// Draws an IEC NOT gate. This function is also available as `element.iec-gate-not()`
|
/// Draws an IEC NOT gate. This function is also available as `element.iec-gate-not()`
|
||||||
///
|
///
|
||||||
/// For parameters, see #doc-ref("gates.iec-gate")
|
/// For parameters, see #doc-ref("gates.iec-gate")
|
||||||
/// #examples.gate-iec-not
|
/// #examples.iec-gate-not
|
||||||
#let gate-iec-not(
|
#let iec-gate-not(
|
||||||
x: none,
|
x: none,
|
||||||
y: none,
|
y: none,
|
||||||
w: none,
|
w: none,
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
ports: false,
|
ports: false,
|
||||||
),
|
),
|
||||||
) = {
|
) = {
|
||||||
gate-iec-buf(
|
iec-gate-buf(
|
||||||
x: x,
|
x: x,
|
||||||
y: y,
|
y: y,
|
||||||
w: w,
|
w: w,
|
||||||
|
@@ -94,18 +94,15 @@
|
|||||||
let space = 100% / inputs
|
let space = 100% / inputs
|
||||||
for i in range(inputs) {
|
for i in range(inputs) {
|
||||||
let pct = (i + 0.5) * space
|
let pct = (i + 0.5) * space
|
||||||
let a = (tl, pct, bl)
|
let port-pos = (tl, pct, bl)
|
||||||
let b = (tr, pct, br)
|
|
||||||
let int-name = id + "i" + str(i)
|
|
||||||
draw.intersections(
|
|
||||||
int-name,
|
|
||||||
func,
|
|
||||||
draw.hide(draw.line(a, b))
|
|
||||||
)
|
|
||||||
let port-name = "in" + str(i)
|
let port-name = "in" + str(i)
|
||||||
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), to: port-pos)
|
||||||
}
|
}
|
||||||
add-port(
|
add-port(
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
/// Draws an IEC-OR gate. This function is also available as `element.iec-gate-or()`
|
/// Draws an IEC-OR gate. This function is also available as `element.iec-gate-or()`
|
||||||
///
|
///
|
||||||
/// For parameters, see #doc-ref("gates.iec-gate")
|
/// For parameters, see #doc-ref("gates.iec-gate")
|
||||||
/// #examples.gate-iec-or
|
/// #examples.iec-gate-or
|
||||||
#let gate-iec-or(
|
#let iec-gate-or(
|
||||||
x: none,
|
x: none,
|
||||||
y: none,
|
y: none,
|
||||||
w: none,
|
w: none,
|
||||||
@@ -37,8 +37,8 @@
|
|||||||
/// Draws an IEC-NOR gate. This function is also available as `element.iec-gate-nor()`
|
/// Draws an IEC-NOR gate. This function is also available as `element.iec-gate-nor()`
|
||||||
///
|
///
|
||||||
/// For parameters, see #doc-ref("gates.iec-gate")
|
/// For parameters, see #doc-ref("gates.iec-gate")
|
||||||
/// #examples.gate-iec-nor
|
/// #examples.iec-gate-nor
|
||||||
#let gate-iec-nor(
|
#let iec-gate-nor(
|
||||||
x: none,
|
x: none,
|
||||||
y: none,
|
y: none,
|
||||||
w: none,
|
w: none,
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
ports: false
|
ports: false
|
||||||
)
|
)
|
||||||
) = {
|
) = {
|
||||||
gate-iec-or(
|
iec-gate-or(
|
||||||
x: x,
|
x: x,
|
||||||
y: y,
|
y: y,
|
||||||
w: w,
|
w: w,
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
/// Draws an IEC-XOR gate. This function is also available as `element.iec-gate-xor()`
|
/// Draws an IEC-XOR gate. This function is also available as `element.iec-gate-xor()`
|
||||||
///
|
///
|
||||||
/// For parameters, see #doc-ref("gates.iec-gate")
|
/// For parameters, see #doc-ref("gates.iec-gate")
|
||||||
/// #examples.gate-iec-xor
|
/// #examples.iec-gate-xor
|
||||||
#let gate-iec-xor(
|
#let iec-gate-xor(
|
||||||
x: none,
|
x: none,
|
||||||
y: none,
|
y: none,
|
||||||
w: none,
|
w: none,
|
||||||
@@ -34,11 +34,11 @@
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Draws an IEC-NXOR gate. This function is also available as `element.iec-gate-nxor()`
|
/// Draws an IEC-XNOR gate. This function is also available as `element.iec-gate-xnor()`
|
||||||
///
|
///
|
||||||
/// For parameters, see #doc-ref("gates.iec-gate")
|
/// For parameters, see #doc-ref("gates.iec-gate")
|
||||||
/// #examples.gate-iec-nxor
|
/// #examples.iec-gate-xnor
|
||||||
#let gate-iec-nxor(
|
#let iec-gate-xnor(
|
||||||
x: none,
|
x: none,
|
||||||
y: none,
|
y: none,
|
||||||
w: none,
|
w: none,
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
ports: false
|
ports: false
|
||||||
)
|
)
|
||||||
) = {
|
) = {
|
||||||
gate-iec-xor(
|
iec-gate-xor(
|
||||||
x: x,
|
x: x,
|
||||||
y: y,
|
y: y,
|
||||||
w: w,
|
w: w,
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
#import "elements/logic/xor.typ": gate-xor, gate-xnor
|
#import "elements/logic/xor.typ": gate-xor, gate-xnor
|
||||||
#import "elements/logic/buf.typ": gate-buf, gate-not
|
#import "elements/logic/buf.typ": gate-buf, gate-not
|
||||||
#import "elements/logic/iec_gate.typ": iec-gate
|
#import "elements/logic/iec_gate.typ": iec-gate
|
||||||
#import "elements/logic/iec_and.typ": gate-iec-and, gate-iec-nand
|
#import "elements/logic/iec_and.typ": iec-gate-and, iec-gate-nand
|
||||||
#import "elements/logic/iec_or.typ": gate-iec-or, gate-iec-nor
|
#import "elements/logic/iec_or.typ": iec-gate-or, iec-gate-nor
|
||||||
#import "elements/logic/iec_buf.typ": gate-iec-buf, gate-iec-not
|
#import "elements/logic/iec_buf.typ": iec-gate-buf, iec-gate-not
|
||||||
#import "elements/logic/iec_xor.typ": gate-iec-xor, gate-iec-nxor
|
#import "elements/logic/iec_xor.typ": iec-gate-xor, iec-gate-xnor
|
||||||
|
100
src/wire.typ
100
src/wire.typ
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
/// List of valid wire styles
|
/// List of valid wire styles
|
||||||
/// #examples.wires
|
/// #examples.wires
|
||||||
#let wire-styles = ("direct", "zigzag", "dodge")
|
#let wire-styles = ("direct", "zigzag", "dodge", "guided")
|
||||||
#let signal-width = 1pt
|
#let signal-width = 1pt
|
||||||
#let bus-width = 1.5pt
|
#let bus-width = 1.5pt
|
||||||
|
|
||||||
@@ -109,6 +109,88 @@
|
|||||||
return (points, anchors)
|
return (points, anchors)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#let get-guided-wire(pts, margins, sides, center-guides, ctx) = {
|
||||||
|
let start = pts.first()
|
||||||
|
let end = pts.last()
|
||||||
|
let (margin-start, margin-end) = margins
|
||||||
|
let (side-start, side-end) = sides
|
||||||
|
let (center_horizontal, center_vertical) = center-guides
|
||||||
|
|
||||||
|
let (ctx, p0) = coordinate.resolve(ctx, start)
|
||||||
|
let (ctx, p6) = coordinate.resolve(ctx, end)
|
||||||
|
p0 = (x: p0.first(), y: p0.at(1))
|
||||||
|
p6 = (x: p6.first(), y: p6.at(1))
|
||||||
|
|
||||||
|
let box_width = calc.abs(p6.x - p0.x)
|
||||||
|
let box_height = calc.abs(p6.y - p0.y)
|
||||||
|
|
||||||
|
// finding correct dx and dy
|
||||||
|
let dx1 = box_width * margin-start / 100%
|
||||||
|
if side-start == "west" {
|
||||||
|
dx1 *= -1
|
||||||
|
} else if side-start == "north" or side-start == "south" { dx1 = 0}
|
||||||
|
|
||||||
|
let dx2 = box_width * margin-end / 100%
|
||||||
|
if side-end == "west" {
|
||||||
|
dx2 *= -1
|
||||||
|
} else if side-end == "north" or side-end == "south" { dx2 = 0}
|
||||||
|
|
||||||
|
let dy1 = box_height * margin-start / 100%
|
||||||
|
if side-start == "south" {
|
||||||
|
dy1 *= -1
|
||||||
|
} else if side-start == "west" or side-start == "east" { dy1 = 0}
|
||||||
|
|
||||||
|
let dy2 = box_height * margin-end / 100%
|
||||||
|
if side-end == "south" {
|
||||||
|
dy2 *= -1
|
||||||
|
} else if side-end == "west" or side-end == "east" { dy2 = 0}
|
||||||
|
|
||||||
|
|
||||||
|
// points that are closest to the edge points
|
||||||
|
let p1 = (p0.x + dx1, p0.y + dy1)
|
||||||
|
let p5 = (p6.x + dx2, p6.y + dy2)
|
||||||
|
|
||||||
|
|
||||||
|
// middle point
|
||||||
|
let center_x = p0.x + box_width * center_horizontal / 100%
|
||||||
|
let center_y = p0.y + box_height * center_vertical / 100%
|
||||||
|
let p3 = (center_x, center_y)
|
||||||
|
|
||||||
|
// setting up the points for that touch the guides
|
||||||
|
let p2 = (0,0)
|
||||||
|
let p4 = (0,0)
|
||||||
|
if side-start in ("north", "south") {
|
||||||
|
p2 = (horizontal: p3, vertical: p1)
|
||||||
|
} else {
|
||||||
|
p2 = (horizontal: p1, vertical: p3)
|
||||||
|
}
|
||||||
|
if side-end in ("north", "south") {
|
||||||
|
p4 = (horizontal: p3, vertical: p5)
|
||||||
|
} else if side-end in ("east", "west") {
|
||||||
|
p4 = (horizontal: p5, vertical: p3)
|
||||||
|
}
|
||||||
|
|
||||||
|
// returning
|
||||||
|
let points = (
|
||||||
|
start,
|
||||||
|
p1,
|
||||||
|
p2,
|
||||||
|
p3,
|
||||||
|
p4,
|
||||||
|
p5,
|
||||||
|
end
|
||||||
|
)
|
||||||
|
let anchors = (
|
||||||
|
"start": start,
|
||||||
|
"start2": points.at(1),
|
||||||
|
"guide-start": points.at(2),
|
||||||
|
"center": points.at(3),
|
||||||
|
"guide-end": points.at(4),
|
||||||
|
"end2": points.at(5),
|
||||||
|
"end": end
|
||||||
|
)
|
||||||
|
return (points, anchors)
|
||||||
|
}
|
||||||
/// Draws a wire between two points
|
/// Draws a wire between two points
|
||||||
/// - id (str): The wire's id, for future reference (anchors)
|
/// - id (str): The wire's id, for future reference (anchors)
|
||||||
/// - pts (array): The two points (as CeTZ compatible coordinates, i.e. XY, relative positions, ids, etc.)
|
/// - pts (array): The two points (as CeTZ compatible coordinates, i.e. XY, relative positions, ids, etc.)
|
||||||
@@ -127,6 +209,9 @@
|
|||||||
/// - dodge-y (number): Y position to dodge the wire to (only with style "dodge")
|
/// - dodge-y (number): Y position to dodge the wire to (only with style "dodge")
|
||||||
/// - dodge-sides (array): The start and end sides (going out of the connected element) of the wire (only with style "dodge")
|
/// - 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")
|
/// - dodge-margins (array): The start and end margins (i.e. space before dodging) of the wire (only with style "dodge")
|
||||||
|
/// - guided-center (array): the horizontal and vertical guides of the center guides (only with style "guided")
|
||||||
|
/// - guided-margins (array): the start and end of guided margins of the wire (only with style "guided")
|
||||||
|
/// - guided-sides (array): the side of start and end array (must be either "north", "south", "west", "east") (only work with style "guided")
|
||||||
#let wire(
|
#let wire(
|
||||||
id, pts,
|
id, pts,
|
||||||
bus: false,
|
bus: false,
|
||||||
@@ -137,6 +222,9 @@
|
|||||||
dashed: false,
|
dashed: false,
|
||||||
style: "direct",
|
style: "direct",
|
||||||
reverse: false,
|
reverse: false,
|
||||||
|
guided-center: (50%, 50%),
|
||||||
|
guided-margins: (5%, 5%),
|
||||||
|
guided-sides: ("east", "west"),
|
||||||
directed: false,
|
directed: false,
|
||||||
rotate-name: true,
|
rotate-name: true,
|
||||||
zigzag-ratio: 50%,
|
zigzag-ratio: 50%,
|
||||||
@@ -178,6 +266,14 @@
|
|||||||
dodge-sides,
|
dodge-sides,
|
||||||
ctx
|
ctx
|
||||||
)
|
)
|
||||||
|
} else if style == "guided" {
|
||||||
|
(points, anchors) = get-guided-wire(
|
||||||
|
pts,
|
||||||
|
guided-margins,
|
||||||
|
guided-sides,
|
||||||
|
guided-center,
|
||||||
|
ctx
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
let mark = (fill: color)
|
let mark = (fill: color)
|
||||||
@@ -303,4 +399,4 @@
|
|||||||
name
|
name
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user