Na webu jsem našel pokus jak přeložit knihovnu ngspice pro webassembly. Tak jsem to zkusil. Bohužel bez výsledku, linkování skončilo nekonečným swapem. Uplynul nějaký čas, nástroje se zlepšily, s emscripten 3.1.15 se to už povedlo, takže si s tím šlo hrát. Knihovna ngspice potřebuje pár drobných úprav (wasm.patch), takže je dobré použít verzi 32, na které je to otestováno.
Ukázalo se, že to nebude tak jednoduché. Výpočet tranzientní simulace může trvat poměrně dlouho, normálně se spouští vlákno, což v prohlížeči působí značné potíže. I když už by to mělo být také vyřešeno, zde jsem problém obešel tím, že je to koncipováno jako web worker. Na druhou stranu se mi zase nepodařilo propašovat z C++ do javascriptu složitější objekty, takže to skončilo tím, že vykreslování do canvasu je divné. C++ kód vygeneruje text, který je pak v javascriptu interpretován jako kód (eval()). Ano, je to divné, ale funguje to a poměrně svižně.
Program je jednoduchý - v levém textovém poli, které lze editovat je simulovaný obvod, lze ho ručně upravovat nebo pomocí copy/paste si tam dát úplně něco jiného. Musí to být kompletní popis obvodu, nemá to souborový systém, který by umožňoval .include, na konci musí být parametry tranzientní simulace. Je také možné načíst text z lokálního souboru tlačítkem File. Simulace si tedy načte obvod z obsahu tohoto pole. Tlačítkem Run se spustí simulace, vpravo se zobrazuje průběh výpočtu - status bar. V pravém textovém poli se vypisuje text průběhu simulace a případné chyby (status bar může proběhnout tak rychle, že si toho nevšimnete). Nahoře je pak canvas, do kterého se vykreslují grafy. Je použit trik z Kicadu - uzly, označené pomocí label se prefixují znakem '/' (slash), a ty se pak vykreslují. Ostatní jsou ignorovány.
Defaultní obvod popisuje proudový náraz při zapnutí velkého transformátoru (s reálným feromagnetickým jádrem) v nule napětí (kdyby tomu někdo nevěřil). Je vidět, že to používá dost pokročilé funkce, není to prostý lineární obvod. Pokud do řádku pro zdroj v1 místo sin(0 325 50 0m) dáme sin(0 325 50 -5m), zapínáme v maximu napětí, špička zmizí. Po pravdě řečeno, je to dost citlivé na parametry, změníme-li frekvenci z 50 na 100 Hz, nic zajímavého se zase neděje.
Je to jen hračka, na skutečnou práci to není a nebude, na hraní to vyhovuje. Neumí to digitální a smíšené obvody. Na webu najdete mnoho webových simulátorů v různém stadiu propracovanosti a samotné ngspice lze jednoduše nainstalovat, nebo je vestavěno i v Kicadu. Ukazuje to možnosti co vše lze ve webovém prohlížeči spustit. Stejně už to začíná být dost velké - zabere to asi 4MiB. Kdyby si s tím chtěl někdo hrát, přibalím i zdrojáky, licence bude asi záviset od použité knihovny ngspice, ale pochybuji, že to někdo dokáže komerčně využít. Jak vytvořit knihovnu ngspice pro webassembly je popsáno v Makefile, je to pár příkazů, které ale mohou selhat, tedy dělat z toho nějaký skript nemá smysl.