velxio/test/test_circuit/autosearch/05_velxio_component_invento...

9.8 KiB

Inventario de componentes lógicos y analógicos en Velxio

Auditoría realizada el 2026-04-15 sobre la rama feature/electrical-simulation-ngspice (commit ed9911d). Objetivo: saber qué compuertas lógicas y componentes analógicos genéricos ya existen, en qué capa, y qué falta.

Metodología

Velxio tiene tres capas independientes que deben estar alineadas para que un componente sea "completo":

Capa Archivo de referencia Rol
Visual frontend/src/components/components-wokwi/*.ts[x] + frontend/public/component-svgs/*.svg Web Component / SVG que el usuario ve en el canvas
Metadata frontend/public/components-metadata.json (generado por scripts/generate-component-metadata.ts) Registro que alimenta el ComponentPickerModal — si un componente no está aquí, el usuario no puede añadirlo desde la UI
Digital-sim frontend/src/simulation/parts/*.ts (registro PartSimulationRegistry) Lógica reactiva a cambios de pines del MCU (AVR/RP2040/ESP32)
SPICE-sim frontend/src/simulation/spice/componentToSpice.ts (tabla MAPPERS) Emite tarjetas de netlist para ngspice-WASM en modo eléctrico

Un componente puede existir en una capa sin existir en otra. Ejemplo: las compuertas lógicas tienen visual + digital-sim pero no tienen metadata ni mapper SPICE.

Compuertas lógicas

Registradas como Web Components en LogicGateElements.ts e implementadas como simulación digital reactiva en LogicGateParts.ts:

Metadata ID Visual Digital-sim Metadata JSON SPICE mapper
logic-gate-and wokwi-logic-and
logic-gate-nand wokwi-logic-nand
logic-gate-or wokwi-logic-or
logic-gate-nor wokwi-logic-nor
logic-gate-xor wokwi-logic-xor
logic-gate-not wokwi-logic-not
XNOR

Hallazgos clave:

  • Las 6 compuertas existentes son inaccesibles desde la UI porque no están en components-metadata.json. Hay que añadirlas manualmente en scripts/generate-component-metadata.ts (o vía component-overrides.json) y regenerar el JSON.
  • XNOR falta en las 3 capas. Es la única compuerta básica de 2 entradas ausente.
  • Solo hay variantes de 2 entradas (y NOT con 1). Faltan 3-input y 4-input AND/OR/NAND/NOR — útiles en circuitos reales y muy fáciles de añadir porque la lógica es la misma generalizada.
  • Los tests de spice_logic_gates.test.js y spice_digital.test.js demuestran que la implementación SPICE es trivial con B-sources (V = 20*u(V(a)-2.5)*u(V(b)-2.5) - ...) — ya están los netlists probados.

Analógicos genéricos

Componentes con mapper SPICE (componentToSpice.ts)

Metadata ID Tipo Metadata JSON Visual dedicado
resistor Pasivo
resistor-us Pasivo (símbolo US)
capacitor Pasivo
inductor Pasivo
analog-resistor Pasivo genérico A/B
analog-capacitor Pasivo genérico A/B
analog-inductor Pasivo genérico A/B
led LED con color→modelo Shockley
diode Diodo genérico
diode-1n4148 Diodo small-signal
diode-1n4007 Diodo rectificador 1 kV
zener-1n4733 Zener 5.1 V
bjt-2n2222 NPN general-purpose
bjt-bc547 NPN small-signal
bjt-2n3055 NPN potencia
mosfet-2n7000 NMOS logic-level
mosfet-irf540 NMOS potencia
opamp-ideal Op-amp VCVS gain=1e6
pushbutton Switch
slide-switch Switch
slide-potentiometer Divisor 3 terminales
ntc-temperature-sensor Sensor β-model
photoresistor Sensor R(lux)
instr-ammeter Amperímetro (V-source 0V + shunt 1 mΩ)
instr-voltmeter Voltímetro (10 MΩ + probe)

Hallazgo clave: de 25 mappers SPICE, solo 6 (resistor, led, pushbutton, slide-switch, slide-potentiometer, ntc-temperature-sensor, photoresistor) tienen entrada en components-metadata.json. Los 19 restantes funcionan en el solver pero son invisibles para el usuario — se pueden instanciar solo programáticamente.

Familias incompletas

Familia Lo que hay Lo que falta
BJT NPN: 2N2222, BC547, 2N3055 PNP: 2N3906, BC557
MOSFET NMOS: 2N7000, IRF540 PMOS: IRF9540, FQP27P06; JFETs
Diodos Rectificador, small-signal, Zener 5.1 V Schottky (1N5817/1N5819), TVS, photodiode, Zener en otros valores
Op-amps Solo ideal LM358, LM741, TL072, LM324 (modelos reales con Vsat/slew/offset)
Fuentes Solo opamp-ideal VCVS Battery (9V, AA, coin-cell), DC genérico, AC signal generator
Reguladores Ninguno LM7805, LM7812, LM317, TL431

Completamente ausentes

  • Relay con coil + contactos NC/NO (hay Web Component visual suelto, pero sin mapper)
  • Transformer (acoplamiento inductivo con K mutual coupling)
  • Crystal / cristal de cuarzo
  • Altavoz / piezo como impedancia RC-L
  • Hall sensor (A3144 tipo switch magnético)
  • Thermocouple K-type
  • RTD PT100/PT1000 (más preciso que NTC)
  • Strain gauge para puente Wheatstone
  • Generador de señales (sine/square/PWL inyectable al netlist)

Instrumentos

Lo que existe:

Faltan:

  • Multímetro DMM con selector (V/Ω/A/continuidad)
  • Osciloscopio analógico que capture transitorios (el actual es digital)
  • Ohmmiter dedicado
  • Signal generator

Implicaciones para testing

  1. Los 62 tests de frontend/src/__tests__/spice-*.test.ts + los 88 tests del sandbox ejercitan los mappers SPICE vía netlists hand-crafted, así que la ausencia de metadata JSON no impide probar la corriente. Sí impide probar el flujo UI-picker → canvas → netlist end-to-end.
  2. Cualquier test nuevo para una compuerta XNOR o un transistor PNP debe emitir netlist directamente con runNetlist(...) hasta que exista el mapper.
  3. El docs/wiki/circuit-emulation-gotchas.md advierte sobre caracteres no-ASCII en netlists de ngspice — reconfirmado en la sesión de hoy: en títulos rompe el parser silenciosamente (30 s timeout sin error). Añadir a la lista de gotchas.
  1. Generador de metadata (limitación importante): scripts/generate-component-metadata.ts escanea exclusivamente third-party/wokwi-elements/src/*-element.ts (ver función findElementFiles()). El mecanismo de scripts/component-overrides.json NO permite añadir componentes nuevos — solo parcha propiedades de los componentes que el escaneo ya encontró (ver función applyOverrides(): itera sobre components y busca overrides[comp.id]; si el componente no fue detectado, el override queda inutilizado).

    Consecuencia: todo lo que viva solo en frontend/src/components/components-wokwi/ (compuertas lógicas, Bmp280Element, IC74HC595, RaspberryPi3Element, etc.) queda fuera del metadata. Cualquier componente nuevo que no exista también en wokwi-elements está en el mismo caso.

    Regeneración destruye cualquier edición manual de components-metadata.json: el generador sobrescribe el archivo entero con fs.writeFileSync(outputPath, JSON.stringify(output, null, 2)). Editar components-metadata.json a mano es inútil; el próximo npm run generate-metadata (o el build que lo ejecute) lo reemplazará.

    Opciones para arreglar esto (cualquiera en fase 9):

    • A. Extender component-overrides.json con una sección nueva "_customComponents": [ {...metadata...} ] y modificar applyOverrides() para hacer components.push(...) al inicio con esas entradas. Así sobrevive a la regeneración.
    • B. Nuevo archivo scripts/custom-components.json cargado por el generador en un paso adicional (separa claramente "patches a wokwi-elements" de "componentes propios de Velxio").
    • C. El generador también escanea frontend/src/components/components-wokwi/*.ts y reconoce un patrón (p.ej. export const VELXIO_METADATA = {...}). Más invasivo, pero elimina la duplicación.

    Recomendación: opción A — mínimo cambio en el generador (~15 líneas), un solo archivo de override, y permite regenerar todo sin miedo a perder entradas custom.

  2. Convergencia de ngspice: la sesión de hoy mostró que NMOS Level=3 con W=0.1 (¡interpretado como 0.1 metros!) hace que ngspice cuelgue en .op. Los mappers actuales de mosfet-2n7000 y mosfet-irf540 usan esos valores. Funciona por accidente en los tests porque Vgs alto fuerza la saturación; con Vgs marginal colgará. Migrar a Level=1 con W=200u L=2u es más robusto.

  3. Polaridad de pins: los mappers asumen nombres de pin ('A', 'B', 'C'/'B'/'E', 'D'/'G'/'S'). Los componentes visuales todavía-no-existentes tendrán que usar exactamente esos nombres o el netLookup devolverá null y el componente se salteará silenciosamente.

Próximos pasos concretos

Ver plan/phase_9_component_catalog_expansion.md.