From 7e0209b7123a699cf38e93971499a212971f53db Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Fri, 17 May 2024 09:36:38 +0200 Subject: [PATCH] added doc for circuit, util and wire --- manual.pdf | Bin 0 -> 52082 bytes manual.typ | 28 ++++++++++++++++++++++++++++ src/circuit.typ | 6 ++++++ src/util.typ | 19 +++++++++++++++++++ src/wire.typ | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+) create mode 100644 manual.pdf create mode 100644 manual.typ diff --git a/manual.pdf b/manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..33f271c9adc4eee924432744db6498923769541e GIT binary patch literal 52082 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

(Y8ktduMKZyRoH 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 RNgym25yQ24^DaZp{{aBI^@sof literal 0 HcmV?d00001 diff --git a/manual.typ b/manual.typ new file mode 100644 index 0000000..ed1bbb2 --- /dev/null +++ b/manual.typ @@ -0,0 +1,28 @@ +#import "@preview/tidy:0.3.0" +#import "@preview/cetz:0.2.2": draw +#import "src/circuit.typ": circuit +#import "src/util.typ" +#import "src/wire.typ" + +#let circuit-docs = tidy.parse-module( + read("src/circuit.typ"), + name: "circuit", + require-all-parameters: true +) +#tidy.show-module(circuit-docs) + +#let util-docs = tidy.parse-module( + read("src/util.typ"), + name: "util", + require-all-parameters: true, + scope: (util: util) +) +#tidy.show-module(util-docs) + +#let wire-docs = tidy.parse-module( + read("src/wire.typ"), + name: "wire", + require-all-parameters: true, + scope: (wire: wire, circuit: circuit, draw: draw) +) +#tidy.show-module(wire-docs) \ No newline at end of file diff --git a/src/circuit.typ b/src/circuit.typ index a45de68..84fb819 100644 --- a/src/circuit.typ +++ b/src/circuit.typ @@ -1,5 +1,11 @@ #import "@preview/cetz:0.2.2": canvas +#import "@preview/tidy:0.3.0" +/// Draws a block circuit diagram +/// +/// - body (none, array, element): A code block in which draw functions have been called +/// - length (length, ratio): Optional base unit +/// -> none #let circuit(body, length: 2em) = { set text(font: "Source Sans 3") canvas(length: length, body) diff --git a/src/util.typ b/src/util.typ index 5180f5a..62da0f5 100644 --- a/src/util.typ +++ b/src/util.typ @@ -1,3 +1,4 @@ +/// Predefined color palette #let colors = ( orange: rgb(245, 180, 147), yellow: rgb(250, 225, 127), @@ -6,11 +7,24 @@ purple: rgb(189, 151, 255) ) +/// Pads a string on the left with 0s to the given length +/// +/// #example(`#util.lpad("0100", 8)`, mode: "markup") +/// +/// - s (str): The string to pad +/// - len (int): The target length +/// -> str #let lpad(s, len) = { let res = "0" * len + s return res.slice(-len) } +/// Returns the anchor on the opposite side of the given one +/// +/// #example(`#util.opposite-anchor("west")`, mode: "markup") +/// +/// - anchor (str): The input anchor +/// -> str #let opposite-anchor(anchor) = { return ( north: "south", @@ -25,6 +39,11 @@ ).at(anchor) } +/// Returns the anchor rotated 90 degrees clockwise relative to the given one +/// +/// #example(`#util.rotate-anchor("west")`, mode: "markup") +/// - anchor (str): The anchor to rotate +/// -> str #let rotate-anchor(anchor) = { return ( north: "east", diff --git a/src/wire.typ b/src/wire.typ index 9b2323c..3e3ff82 100644 --- a/src/wire.typ +++ b/src/wire.typ @@ -1,6 +1,23 @@ #import "@preview/cetz:0.2.2": draw, coordinate #import "util.typ": opposite-anchor +/// List of valid wire styles +/// #box(width: 100%, align(center)[ +/// #circuit({ +/// draw.circle((0, 0), radius: .1, name: "p1") +/// draw.circle((2, 1), radius: .1, name: "p2") +/// draw.circle((3, 0), radius: .1, name: "p3") +/// draw.circle((5, 1), radius: .1, name: "p4") +/// draw.circle((6, 0), radius: .1, name: "p5") +/// draw.circle((8, 1), radius: .1, name: "p6") +/// wire.wire("w1", ("p1", "p2"), style: "direct") +/// wire.wire("w2", ("p3", "p4"), style: "zigzag") +/// wire.wire("w3", ("p5", "p6"), style: "dodge", dodge-y: -0.5, dodge-margins: (0.5, 0.5)) +/// draw.content((1, -1), [`direct`]) +/// draw.content((4, -1), [`zigzag`]) +/// draw.content((7, -1), [`dodge`]) +/// }) +/// ]) #let wire-styles = ("direct", "zigzag", "dodge") #let signal-width = 1pt #let bus-width = 1.5pt @@ -89,6 +106,21 @@ return (points, anchors) } +/// Draws a wire between two points +/// - 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.) +/// - bus (bool): Whether the wire is a bus (multiple bits) or a simple signal (single bit) +/// - name (none, str, array): Optional name of the wire. If it is an array, the first name will be put at the start of the wire, and the second at the end +/// - name-pos (str): Position of the name. One of: "middle", "start" or "end" +/// - slice (none, array): Optional bits slice (start and end bit indices). If set, it will be displayed at the start of the wire +/// - color (color): The stroke color +/// - dashed (bool): Whether the stroke is dashed or not +/// - style (str): The wire's style (see `wire-styles` for possible values) +/// - reverse (bool): If true, the start and end points will be swapped (useful in cases where the start point depends on the end point, for example with perpendiculars) +/// - zigzag-ratio (ratio): Position of the zigzag vertical relative to the horizontal span (only with style "zigzag") +/// - dodge-y (int, float, length, ratio): 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-margins (array): The start and end margins (i.e. space before dodging) of the wire (only with style "dodge") #let wire( id, pts, bus: false, @@ -199,6 +231,20 @@ } }) +/// Draws a wire stub (useful for unlinked ports) +/// +/// #box(width: 100%, align(center)[ +/// #circuit({ +/// draw.circle((0, 0), radius: .1, name: "p") +/// wire.stub("p", "east", name: "port") +/// }) +/// ]) +/// +/// - port-id (str): The port anchor +/// - side (str): The side on which the port is (one of "north", "east", "south", "west") +/// - name (none, str): Optional name displayed at the end of the stub +/// - vertical (bool): Whether the name should be displayed vertically +/// - length (number): The length of the stub #let stub(port-id, side, name: none, vertical: false, length: 1em) = { let offset = ( north: (0, length),