Skip to content

Commit

Permalink
Merge pull request #49 from tscircuit/pcb-elm-refactor
Browse files Browse the repository at this point in the history
PCB Element Refactor
  • Loading branch information
seveibar authored Sep 20, 2024
2 parents e17108c + 8522eea commit 9c0543a
Show file tree
Hide file tree
Showing 32 changed files with 1,372 additions and 235 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# @tscircuit/soup (Circuit JSON Specification)
# Circuit JSON Specification `circuit-json`

[tscircuit](https://github.com/tscircuit/tscircuit) · [Soup Specification Docs](https://docs.tscircuit.com/api-reference/advanced/soup)

Expand All @@ -12,8 +12,8 @@ This module has the zod definitions and conversion functions for using tscircuit
> This is mostly an internal module, you probably want to use the [main tscircuit library](https://github.com/tscircuit/tscircuit) instead.
```ts
import { any_circuit_element, simple_source_resistor } from "@tscircuit/soup"
import type { SourceSimpleResistor } from "@tscircuit/soup"
import { any_circuit_element, simple_source_resistor } from "circuit-json"
import type { SourceSimpleResistor } from "circuit-json"

const resistor: SourceSimpleResistor = simple_source_resistor.parse({
type: "source_component",
Expand Down
293 changes: 293 additions & 0 deletions docs/PCB_COMPONENT_OVERVIEW.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,293 @@
# Circuit JSON Specification: PCB Component Overview

> Created at 2024-09-20T18:37:19.158Z
> Latest Version: https://github.com/tscircuit/circuit-json/blob/main/docs/PCB_COMPONENT_OVERVIEW.md
Any type below can be imported from `circuit-json`. Every type has a corresponding
snake_case version which is a zod type that can be used to parse unknown json,
for example `PcbComponent` has a `pcb_component.parse` function that you
can also import.

```ts
export interface PcbFabricationNotePath {
type: "pcb_fabrication_note_path"
pcb_fabrication_note_path_id: string
pcb_component_id: string
layer: LayerRef
route: Point[]
stroke_width: Length
color?: string
}

export interface PcbComponent {
type: "pcb_component"
pcb_component_id: string
source_component_id: string
center: Point
layer: LayerRef
rotation: Rotation
width: Length
height: Length
}

export interface PcbPortNotMatchedError {
type: "pcb_port_not_matched_error"
pcb_error_id: string
message: string
pcb_component_ids: string[]
}

export interface PcbSilkscreenText {
type: "pcb_silkscreen_text"
pcb_silkscreen_text_id: string
font: "tscircuit2024"
font_size: Length
pcb_component_id: string
text: string
layer: LayerRef
anchor_position: Point
anchor_alignment:
| "center"
| "top_left"
| "top_right"
| "bottom_left"
| "bottom_right"
}

export interface PcbSilkscreenPill {
type: "pcb_silkscreen_pill"
pcb_silkscreen_pill_id: string
pcb_component_id: string
center: Point
width: Length
height: Length
layer: LayerRef
}

export interface PcbPlatedHoleCircle {
type: "pcb_plated_hole"
shape: "circle"
outer_diameter: number
hole_diameter: number
x: Distance
y: Distance
layers: LayerRef[]
port_hints?: string[]
pcb_component_id?: string
pcb_port_id?: string
pcb_plated_hole_id: string
}

export interface PcbPlatedHoleOval {
type: "pcb_plated_hole"
shape: "oval" | "pill"
outer_width: number
outer_height: number
hole_width: number
hole_height: number
x: Distance
y: Distance
layers: LayerRef[]
port_hints?: string[]
pcb_component_id?: string
pcb_port_id?: string
pcb_plated_hole_id: string
}

export type PcbPlatedHole = PcbPlatedHoleCircle | PcbPlatedHoleOval

export interface PcbFabricationNoteText {
type: "pcb_fabrication_note_text"
pcb_fabrication_note_text_id: string
font: "tscircuit2024"
font_size: Length
pcb_component_id: string
text: string
layer: VisibleLayer
anchor_position: Point
anchor_alignment:
| "center"
| "top_left"
| "top_right"
| "bottom_left"
| "bottom_right"
color?: string
}

export interface PcbSilkscreenCircle {
type: "pcb_silkscreen_circle"
pcb_silkscreen_circle_id: string
pcb_component_id: string
center: Point
radius: Length
layer: VisibleLayer
}

export interface PcbSilkscreenPath {
type: "pcb_silkscreen_path"
pcb_silkscreen_path_id: string
pcb_component_id: string
layer: VisibleLayerRef
route: Point[]
stroke_width: Length
}

export interface PcbText {
type: "pcb_text"
pcb_text_id: string
text: string
center: Point
layer: LayerRef
width: Length
height: Length
lines: number
align: "bottom-left"
}

export type PCBKeepout = z.infer<typeof pcb_keepout>

export interface PcbVia {
type: "pcb_via"
pcb_via_id: string
x: Distance
y: Distance
outer_diameter: Distance
hole_diameter: Distance
layers: LayerRef[]
}

export interface PcbSilkscreenOval {
type: "pcb_silkscreen_oval"
pcb_silkscreen_oval_id: string
pcb_component_id: string
center: Point
radius_x: Distance
radius_y: Distance
layer: VisibleLayer
}

export interface PcbPlacementError {
type: "pcb_placement_error"
pcb_placement_error_id: string
message: string
}

export interface PcbPort {
type: "pcb_port"
pcb_port_id: string
source_port_id: string
pcb_component_id: string
x: Distance
y: Distance
layers: LayerRef[]
}

export interface PcbTraceHint {
type: "pcb_trace_hint"
pcb_trace_hint_id: string
pcb_port_id: string
pcb_component_id: string
route: RouteHintPoint[]
}

export interface PcbSmtPadCircle {
type: "pcb_smtpad"
shape: "circle"
pcb_smtpad_id: string
x: Distance
y: Distance
radius: number
layer: LayerRef
port_hints?: string[]
pcb_component_id?: string
pcb_port_id?: string
}

export interface PcbSmtPadRect {
type: "pcb_smtpad"
shape: "rect"
pcb_smtpad_id: string
x: Distance
y: Distance
width: number
height: number
layer: LayerRef
port_hints?: string[]
pcb_component_id?: string
pcb_port_id?: string
}

export type PcbSmtPad = PcbSmtPadCircle | PcbSmtPadRect

export interface PcbSilkscreenLine {
type: "pcb_silkscreen_line"
pcb_silkscreen_line_id: string
pcb_component_id: string
stroke_width: Distance
x1: Distance
y1: Distance
x2: Distance
y2: Distance
layer: VisibleLayer
}

export interface PcbHoleCircleOrSquare {
type: "pcb_hole"
pcb_hole_id: string
hole_shape: "circle" | "square"
hole_diameter: number
x: Distance
y: Distance
}

export interface PcbHoleOval {
type: "pcb_hole"
pcb_hole_id: string
hole_shape: "oval"
hole_width: number
hole_height: number
x: Distance
y: Distance
}

export type PcbHole = PcbHoleCircleOrSquare | PcbHoleOval

export interface PcbTraceRoutePointWire {
route_type: "wire"
x: Distance
y: Distance
width: Distance
start_pcb_port_id?: string
end_pcb_port_id?: string
layer: LayerRef
}

export interface PcbTraceRoutePointVia {
route_type: "via"
x: Distance
y: Distance
from_layer: string
to_layer: string
}

export type PcbTraceRoutePoint = PcbTraceRoutePointWire | PcbTraceRoutePointVia

export interface PcbTrace {
type: "pcb_trace"
source_trace_id?: string
pcb_component_id?: string
pcb_trace_id: string
route_thickness_mode?: "constant" | "interpolated"
should_round_corners?: boolean
route: Array<PcbTraceRoutePoint>
}

export interface PcbBoard {
type: "pcb_board"
pcb_board_id: string
width: Length
height: Length
center: Point
outline?: Point[]
}
```
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "@tscircuit/soup",
"name": "circuit-json",
"version": "0.0.71",
"description": "Definitions for the tscircuit intermediary JSON format",
"main": "dist/index.js",
Expand All @@ -14,6 +14,7 @@
"author": "",
"license": "ISC",
"devDependencies": {
"@anthropic-ai/sdk": "^0.27.3",
"@biomejs/biome": "^1.9.2",
"@types/convert-units": "^2.3.9",
"esbuild": "^0.20.2",
Expand Down
60 changes: 60 additions & 0 deletions scripts/generate-pcb-component-overview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import Anthropic from "@anthropic-ai/sdk"
import fs from "node:fs"
import path from "node:path"

// Read all the files in the src/pcb directory
const pcbDir = path.join(__dirname, "../src/pcb")
const fileContents = fs
.readdirSync(pcbDir)
.map((file) => path.join(pcbDir, file))
.filter((file) => file.endsWith(".ts"))
.map((file) =>
fs
.readFileSync(file, "utf8")
// remove any lines that import
.replace(/^import .*;$/gm, "")
// remove any lines with z.infer, z.input, or z.output
.replace(/^type .*=.*z\.(infer|input|output)<.*>$/gm, ""),
)

// Extract the type definitions from the file contents
const anthropic = new Anthropic()

const msg = await anthropic.messages.create({
model: "claude-3-5-sonnet-20240620",
max_tokens: 4096,
messages: [
{
role: "user",
content: `Extract all the exported type definitions from the following file contents. Do not include deprecated types. Return as a \`\`\`ts codeblock.\n\n${fileContents.join("\n")}`,
},
],
})

const resText: string = (msg as any).content[0].text

const codefence = resText
.split("```")[1]!
.replace(/^ts\n/, "")
.replace(/^typescript\n/, "")

// Write to docs/PCB_COMPONENT_OVERVIEW.md
const template = `# Circuit JSON Specification: PCB Component Overview
> Created at ${new Date().toISOString()}
> Latest Version: https://github.com/tscircuit/circuit-json/blob/main/docs/PCB_COMPONENT_OVERVIEW.md
Any type below can be imported from \`circuit-json\`. Every type has a corresponding
snake_case version which is a zod type that can be used to parse unknown json,
for example \`PcbComponent\` has a \`pcb_component.parse\` function that you
can also import.
\`\`\`ts
${codefence}
\`\`\`
`.trim()

fs.writeFileSync(
path.join(__dirname, "../docs/PCB_COMPONENT_OVERVIEW.md"),
template,
)
Loading

0 comments on commit 9c0543a

Please sign in to comment.