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(commited9911d). 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 enscripts/generate-component-metadata.ts(o víacomponent-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.jsyspice_digital.test.jsdemuestran 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
Kmutual 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:
instr-voltmeter(mapper SPICE)instr-ammeter(mapper SPICE)Voltmeter.tsxyAmmeter.tsx(Web Components)ElectricalOverlay.tsx— muestra voltajes de todos los nodos como overlay SVG
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
- 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. - Cualquier test nuevo para una compuerta XNOR o un transistor PNP debe emitir netlist directamente con
runNetlist(...)hasta que exista el mapper. - El
docs/wiki/circuit-emulation-gotchas.mdadvierte 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.
Riesgos / bloqueadores para ampliar el catálogo
-
Generador de metadata (limitación importante):
scripts/generate-component-metadata.tsescanea exclusivamentethird-party/wokwi-elements/src/*-element.ts(ver funciónfindElementFiles()). El mecanismo descripts/component-overrides.jsonNO permite añadir componentes nuevos — solo parcha propiedades de los componentes que el escaneo ya encontró (ver funciónapplyOverrides(): itera sobrecomponentsy buscaoverrides[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 confs.writeFileSync(outputPath, JSON.stringify(output, null, 2)). Editarcomponents-metadata.jsona mano es inútil; el próximonpm run generate-metadata(o el build que lo ejecute) lo reemplazará.Opciones para arreglar esto (cualquiera en fase 9):
- A. Extender
component-overrides.jsoncon una sección nueva"_customComponents": [ {...metadata...} ]y modificarapplyOverrides()para hacercomponents.push(...)al inicio con esas entradas. Así sobrevive a la regeneración. - B. Nuevo archivo
scripts/custom-components.jsoncargado 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/*.tsy 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.
- A. Extender
-
Convergencia de ngspice: la sesión de hoy mostró que
NMOS Level=3conW=0.1(¡interpretado como 0.1 metros!) hace que ngspice cuelgue en.op. Los mappers actuales demosfet-2n7000ymosfet-irf540usan esos valores. Funciona por accidente en los tests porque Vgs alto fuerza la saturación; con Vgs marginal colgará. Migrar aLevel=1conW=200u L=2ues más robusto. -
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 elnetLookupdevolveránully el componente se salteará silenciosamente.