hrithik18k/punck-tscircuit-recreation

A four-layer Eurorack drum/sampler controller PCB built around an STM32H743, dual QSPI flash, PCM5100 stereo DAC, TL074 analog audio circuitry, input clamps, 12V-to-3.3V power regulation, MIDI/USB/SWD connectors, controls, LEDs, and trigger/audio I/O.

Version
1.0.3
License
unset
Stars
0

scripts/convert.ts

import fs from 'node:fs'
import { KicadToCircuitJsonConverter } from 'kicad-to-circuit-json'
import { CircuitJsonToKicadPcbConverter } from 'circuit-json-to-kicad'
import { convertCircuitJsonToPcbSvg } from 'circuit-to-svg'
import { parse, emit, normalize } from './sexpr'

fs.mkdirSync('boards', { recursive: true })
fs.mkdirSync('dist', { recursive: true })
const results = []
for (const name of ['Components', 'Controls', 'Panel']) {
  const base = `Punck_${name}`
  for (const mode of ['pcb', 'combined'] as const) {
    const c = new KicadToCircuitJsonConverter()
    let pcb = fs.readFileSync(`source/${base}.kicad_pcb`, 'utf8')
    // KiCad 8 compatibility: remove edit-lock flags, normalize primitive fill.
    // Originals remain untouched in source/.
    pcb = emit(normalize(parse(pcb)))
    c.addFile(`${base}.kicad_pcb`, pcb)
    if (mode === 'combined') c.addFile(`${base}.kicad_sch`, emit(normalize(parse(fs.readFileSync(`source/${base}.kicad_sch`, 'utf8')))))
    try {
      c.runUntilFinished()
      const json = c.getOutput()
      const counts = Object.fromEntries([...new Set(json.map(e => e.type))].map(t => [t, json.filter(e => e.type === t).length]))
      fs.writeFileSync(`boards/${name.toLowerCase()}.${mode}.circuit.json`, JSON.stringify(json, null, 2))
      const result: any = { name, mode, counts, warnings: c.getWarnings(), stats: c.getStats() }
      if (mode === 'pcb') {
        try { fs.writeFileSync(`dist/${name}.svg`, convertCircuitJsonToPcbSvg(json)) } catch (e) { result.renderError = String(e) }
        try {
          const out = new CircuitJsonToKicadPcbConverter(json)
          out.runUntilFinished()
          fs.writeFileSync(`dist/${base}.kicad_pcb`, out.getOutputString())
        } catch (e) { result.exportError = String(e) }
      }
      results.push(result)
      console.log(name, mode, JSON.stringify(counts), result.renderError ?? '', result.exportError ?? '')
    } catch (e) { results.push({name, mode, error: String(e), stack: (e as Error).stack}); console.error(name, mode, String(e)) }
  }
}
fs.writeFileSync('evidence/conversion.json', JSON.stringify(results, null, 2))