
L’ingegnere del software Ben C. ha creato uno strumento che unisce il mondo dei linguaggi di descrizione hardware (HDL) con il simulatore di costruzione e gestione Factorio, integrando nel gioco la progettazione di chip, incluso un processore RISC-V funzionante.
“Poco dopo l’uscita di Factorio 2.0, mi sono reso conto che si potevano descrivere i circuiti combinatori in Verilog e farli tradurre da un compilatore”, spiega Ben C. a proposito dell’ispirazione del progetto. “Questo è ciò che rappresenta il progetto. Input Verilog, output Blueprint di Factorio puro. Ho colto l’occasione offerta da questa nuova versione per cimentarmi in un nuovo progetto e in un nuovo linguaggio! Inizialmente volevo solo imparare Rust e i compilatori, ma poi si è trasformato in un grande esperimento software. Ho aggiunto scripting Lua, un’interfaccia grafica basata su nodi (con supporto web e nativo tramite egui), un simulatore di combinatori, partizionamento di grafi, generazione di SVG, risolutori ILP e ottimizzazione degli iperparametri. In realtà è un insieme di molte cose che mi interessavano.”
Verilog è un linguaggio di descrizione hardware (HDL), un tipo di linguaggio specifico di dominio (DSL) progettato per la progettazione di chip, sia per essere eseguito in simulazione su un computer, sia per essere trasformato in gateware da utilizzare con un FPGA (Field-Programmable Gate Array) o altri dispositivi logici programmabili, sia per essere realizzato in produzione su un vero e proprio ASIC (Application-Specific Integrated Circuit). Factorio, invece, è stato lanciato nel 2020 da Wube Software come simulazione di costruzione e gestione e ha ricevuto un importante aggiornamento, noto come Factorio 2.0, nel 2024.

“Per raggiungere questo obiettivo utilizzo due programmi”, spiega Ben C. “Il primo è un compilatore front-end che prende il codice Verilog e produce un grafo logico che può essere approssimativamente tradotto nella logica di Factorio. Al termine di questo processo ci troviamo con un mix di logica a grana fine e rappresentazioni a livello di parola a grana grossa. A questo punto entra in gioco Rust. Leggo questo JSON e lo converto in quello che chiamo un ‘MappedDesign”; Ci sono alcune piccole modifiche aggiuntive per rendere il formato di un MappedDesign più favorevole, ma non è così importante. Si tratta essenzialmente di un output Yosys deserializzato.”
La fase di compilazione passa quindi alla pianificazione fisica, utilizzando combinatori e strutture di cablaggio presenti nel gioco per costruire il progetto pezzo per pezzo. “Dato che il percorso posizionerà i pali della corrente”, spiega Ben C., “possiamo riutilizzarli per la distribuzione dell’energia. La prima cosa da fare è determinare se ogni combinatore è coperto da un’area di distribuzione dell’energia; se alcuni combinatori mancano, posiziono un nuovo palo per massimizzare la copertura nelle aree mancanti. Una volta soddisfatto della copertura, eseguo un’esplorazione del grafo basata su euristiche per cercare di minimizzare il numero di fili di rame, assicurandomi al contempo di avere una sola rete di distribuzione dell’energia. A volte non è perfetto, ma funziona abbastanza bene. Credo che per il core RISC-V mi sia bastato posizionare manualmente un paio di sottostazioni per ottenere una copertura completa.”
Maggiori dettagli sul progetto sono disponibili nel post di Ben C. su Reddit, mentre il codice sorgente è disponibile su GitHub sotto licenza GNU Affero General Public License 3. Sul sito web dello sviluppatore è disponibile un sito live che ospita il flusso di back-end “con un’interfaccia grafica sovrapposta”, a scopo di simulazione e sperimentazione.
Iscriviti ai nostri gruppi Telegram
Link utili