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