diff --git a/Cargo.lock b/Cargo.lock index 569668e8..f9deaddb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -720,14 +720,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "frontend-api" -version = "0.1.0" -dependencies = [ - "serde", - "thiserror", -] - [[package]] name = "futures" version = "0.3.31" @@ -1164,6 +1156,14 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "language-api" +version = "0.1.0" +dependencies = [ + "serde", + "thiserror", +] + [[package]] name = "libc" version = "0.2.180" @@ -1880,16 +1880,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" -[[package]] -name = "prometeu" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "prometeu-compiler", - "prometeu-runtime-desktop", -] - [[package]] name = "prometeu-abi" version = "0.1.0" @@ -1914,13 +1904,23 @@ dependencies = [ "serde", ] +[[package]] +name = "prometeu-cli" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "prometeu-compiler", + "prometeu-host-desktop-winit", +] + [[package]] name = "prometeu-compiler" version = "0.1.0" dependencies = [ "anyhow", "clap", - "frontend-api", + "language-api", "pathdiff", "prometeu-abi", "prometeu-analysis", @@ -1930,32 +1930,32 @@ dependencies = [ "tempfile", ] +[[package]] +name = "prometeu-drivers" +version = "0.1.0" +dependencies = [ + "prometeu-abi", + "prometeu-hal", + "prometeu-vm", + "serde_json", +] + [[package]] name = "prometeu-firmware" version = "0.1.0" dependencies = [ "prometeu-abi", "prometeu-bytecode", - "prometeu-hardware", - "prometeu-hardware-contract", - "prometeu-kernel", + "prometeu-drivers", + "prometeu-hal", + "prometeu-system", "prometeu-vm", "serde", "serde_json", ] [[package]] -name = "prometeu-hardware" -version = "0.1.0" -dependencies = [ - "prometeu-abi", - "prometeu-hardware-contract", - "prometeu-vm", - "serde_json", -] - -[[package]] -name = "prometeu-hardware-contract" +name = "prometeu-hal" version = "0.1.0" dependencies = [ "prometeu-abi", @@ -1965,15 +1965,20 @@ dependencies = [ ] [[package]] -name = "prometeu-kernel" +name = "prometeu-host-desktop-winit" version = "0.1.0" dependencies = [ + "clap", + "cpal", + "pixels", "prometeu-abi", - "prometeu-bytecode", - "prometeu-hardware", - "prometeu-hardware-contract", - "prometeu-vm", + "prometeu-drivers", + "prometeu-firmware", + "prometeu-hal", + "prometeu-system", + "ringbuf", "serde_json", + "winit", ] [[package]] @@ -1988,20 +1993,15 @@ dependencies = [ ] [[package]] -name = "prometeu-runtime-desktop" +name = "prometeu-system" version = "0.1.0" dependencies = [ - "clap", - "cpal", - "pixels", "prometeu-abi", - "prometeu-firmware", - "prometeu-hardware", - "prometeu-hardware-contract", - "prometeu-kernel", - "ringbuf", + "prometeu-bytecode", + "prometeu-drivers", + "prometeu-hal", + "prometeu-vm", "serde_json", - "winit", ] [[package]] @@ -2010,7 +2010,7 @@ version = "0.1.0" dependencies = [ "prometeu-abi", "prometeu-bytecode", - "prometeu-hardware-contract", + "prometeu-hal", "serde", ] diff --git a/Cargo.toml b/Cargo.toml index 2002bdf8..13bc3f0e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,18 +1,18 @@ [workspace] members = [ - "crates/prometeu-abi", - "crates/prometeu-vm", - "crates/prometeu-kernel", - "crates/prometeu-hardware", - "crates/prometeu-runtime-desktop", - "crates/prometeu", - "crates/prometeu-bytecode", - "crates/prometeu-compiler", - "crates/prometeu-firmware", - "crates/prometeu-analysis", - "crates/prometeu-lsp", - "crates/prometeu-hardware-contract", - "crates/frontend-api" + "crates/compiler/prometeu-abi", + "crates/console/prometeu-vm", + "crates/console/prometeu-system", + "crates/console/prometeu-drivers", + "crates/host/prometeu-host-desktop-winit", + "crates/tools/prometeu-cli", + "crates/compiler/prometeu-bytecode", + "crates/compiler/prometeu-compiler", + "crates/console/prometeu-firmware", + "crates/compiler/prometeu-analysis", + "crates/tools/prometeu-lsp", + "crates/console/prometeu-hal", + "crates/language-api" ] resolver = "2" diff --git a/README.md b/README.md index 9b0c6b9b..730e6a3d 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,9 @@ PROMETEU is an **educational and experimental ecosystem** inspired by classic co This repository is organized as a Rust workspace and contains several components: - **[crates/](./crates)**: Software implementation in Rust. - - **[prometeu](./crates/prometeu)**: Unified command-line interface (CLI). - - **[prometeu-hardware](./crates/prometeu-hardware)**: The virtual hardware (GPU, SPU, Input). - - **[prometeu-runtime-desktop](crates/prometeu-runtime-desktop)**: Host for execution on Desktop systems. + - **[prometeu](crates/tools/prometeu)**: Unified command-line interface (CLI). + - **[prometeu-drivers](crates/console/prometeu-drivers)**: The virtual hardware (GPU, SPU, Input). + - **[prometeu-host-desktop-winit](crates/host/prometeu-host-desktop-winit)**: Host for execution on Desktop systems. - **[docs/](./docs)**: Technical documentation and system specifications. - **[devtools-protocol/](devtools)**: Definition of the communication protocol for development tools. - **[test-cartridges/](./test-cartridges)**: Cartridge examples and test suites. @@ -60,7 +60,7 @@ To run an example cartridge: ./target/debug/prometeu run test-cartridges/color-square-ts ``` -For more details on how to use the CLI, see the **[prometeu](./crates/prometeu)** README. +For more details on how to use the CLI, see the **[prometeu](crates/tools/prometeu)** README. --- diff --git a/crates/prometeu-abi/Cargo.toml b/crates/compiler/prometeu-abi/Cargo.toml similarity index 100% rename from crates/prometeu-abi/Cargo.toml rename to crates/compiler/prometeu-abi/Cargo.toml diff --git a/crates/compiler/prometeu-abi/src/lib.rs b/crates/compiler/prometeu-abi/src/lib.rs new file mode 100644 index 00000000..19160f23 --- /dev/null +++ b/crates/compiler/prometeu-abi/src/lib.rs @@ -0,0 +1,9 @@ +mod value; +mod vm_init_error; +mod program; +mod vm_fault; + +pub use vm_fault::VmFault; +pub use program::ProgramImage; +pub use vm_init_error::VmInitError; +pub use value::Value; diff --git a/crates/prometeu-abi/src/virtual_machine/program.rs b/crates/compiler/prometeu-abi/src/program.rs similarity index 99% rename from crates/prometeu-abi/src/virtual_machine/program.rs rename to crates/compiler/prometeu-abi/src/program.rs index 4653c62d..e9e45395 100644 --- a/crates/prometeu-abi/src/virtual_machine/program.rs +++ b/crates/compiler/prometeu-abi/src/program.rs @@ -1,8 +1,8 @@ -use crate::virtual_machine::Value; use prometeu_bytecode::abi::TrapInfo; use prometeu_bytecode::{BytecodeModule, ConstantPoolEntry, DebugInfo, Export, FunctionMeta}; use std::collections::HashMap; use std::sync::Arc; +use crate::Value; /// Represents a fully linked, executable PBS program image. /// diff --git a/crates/prometeu-abi/src/virtual_machine/value.rs b/crates/compiler/prometeu-abi/src/value.rs similarity index 100% rename from crates/prometeu-abi/src/virtual_machine/value.rs rename to crates/compiler/prometeu-abi/src/value.rs diff --git a/crates/compiler/prometeu-abi/src/vm_fault.rs b/crates/compiler/prometeu-abi/src/vm_fault.rs new file mode 100644 index 00000000..1db51d3c --- /dev/null +++ b/crates/compiler/prometeu-abi/src/vm_fault.rs @@ -0,0 +1,6 @@ +#[derive(Debug, PartialEq, Clone)] +pub enum VmFault { + Trap(u32, String), + Panic(String), + Unavailable, +} \ No newline at end of file diff --git a/crates/prometeu-abi/src/virtual_machine/vm_init_error.rs b/crates/compiler/prometeu-abi/src/vm_init_error.rs similarity index 100% rename from crates/prometeu-abi/src/virtual_machine/vm_init_error.rs rename to crates/compiler/prometeu-abi/src/vm_init_error.rs diff --git a/crates/prometeu-analysis/Cargo.toml b/crates/compiler/prometeu-analysis/Cargo.toml similarity index 100% rename from crates/prometeu-analysis/Cargo.toml rename to crates/compiler/prometeu-analysis/Cargo.toml diff --git a/crates/prometeu-analysis/src/file_db.rs b/crates/compiler/prometeu-analysis/src/file_db.rs similarity index 100% rename from crates/prometeu-analysis/src/file_db.rs rename to crates/compiler/prometeu-analysis/src/file_db.rs diff --git a/crates/prometeu-analysis/src/ids.rs b/crates/compiler/prometeu-analysis/src/ids.rs similarity index 100% rename from crates/prometeu-analysis/src/ids.rs rename to crates/compiler/prometeu-analysis/src/ids.rs diff --git a/crates/prometeu-analysis/src/interner.rs b/crates/compiler/prometeu-analysis/src/interner.rs similarity index 100% rename from crates/prometeu-analysis/src/interner.rs rename to crates/compiler/prometeu-analysis/src/interner.rs diff --git a/crates/prometeu-analysis/src/lib.rs b/crates/compiler/prometeu-analysis/src/lib.rs similarity index 100% rename from crates/prometeu-analysis/src/lib.rs rename to crates/compiler/prometeu-analysis/src/lib.rs diff --git a/crates/prometeu-analysis/src/span.rs b/crates/compiler/prometeu-analysis/src/span.rs similarity index 100% rename from crates/prometeu-analysis/src/span.rs rename to crates/compiler/prometeu-analysis/src/span.rs diff --git a/crates/prometeu-analysis/src/text_index.rs b/crates/compiler/prometeu-analysis/src/text_index.rs similarity index 100% rename from crates/prometeu-analysis/src/text_index.rs rename to crates/compiler/prometeu-analysis/src/text_index.rs diff --git a/crates/prometeu-analysis/tests/file_db_line_index.rs b/crates/compiler/prometeu-analysis/tests/file_db_line_index.rs similarity index 100% rename from crates/prometeu-analysis/tests/file_db_line_index.rs rename to crates/compiler/prometeu-analysis/tests/file_db_line_index.rs diff --git a/crates/prometeu-analysis/tests/span_tests.rs b/crates/compiler/prometeu-analysis/tests/span_tests.rs similarity index 100% rename from crates/prometeu-analysis/tests/span_tests.rs rename to crates/compiler/prometeu-analysis/tests/span_tests.rs diff --git a/crates/prometeu-analysis/tests/text_index_tests.rs b/crates/compiler/prometeu-analysis/tests/text_index_tests.rs similarity index 100% rename from crates/prometeu-analysis/tests/text_index_tests.rs rename to crates/compiler/prometeu-analysis/tests/text_index_tests.rs diff --git a/crates/prometeu-bytecode/Cargo.toml b/crates/compiler/prometeu-bytecode/Cargo.toml similarity index 100% rename from crates/prometeu-bytecode/Cargo.toml rename to crates/compiler/prometeu-bytecode/Cargo.toml diff --git a/crates/prometeu-bytecode/README.md b/crates/compiler/prometeu-bytecode/README.md similarity index 100% rename from crates/prometeu-bytecode/README.md rename to crates/compiler/prometeu-bytecode/README.md diff --git a/crates/prometeu-bytecode/src/abi.rs b/crates/compiler/prometeu-bytecode/src/abi.rs similarity index 100% rename from crates/prometeu-bytecode/src/abi.rs rename to crates/compiler/prometeu-bytecode/src/abi.rs diff --git a/crates/prometeu-bytecode/src/asm.rs b/crates/compiler/prometeu-bytecode/src/asm.rs similarity index 100% rename from crates/prometeu-bytecode/src/asm.rs rename to crates/compiler/prometeu-bytecode/src/asm.rs diff --git a/crates/prometeu-bytecode/src/decoder.rs b/crates/compiler/prometeu-bytecode/src/decoder.rs similarity index 100% rename from crates/prometeu-bytecode/src/decoder.rs rename to crates/compiler/prometeu-bytecode/src/decoder.rs diff --git a/crates/prometeu-bytecode/src/disasm.rs b/crates/compiler/prometeu-bytecode/src/disasm.rs similarity index 100% rename from crates/prometeu-bytecode/src/disasm.rs rename to crates/compiler/prometeu-bytecode/src/disasm.rs diff --git a/crates/prometeu-bytecode/src/io.rs b/crates/compiler/prometeu-bytecode/src/io.rs similarity index 100% rename from crates/prometeu-bytecode/src/io.rs rename to crates/compiler/prometeu-bytecode/src/io.rs diff --git a/crates/prometeu-bytecode/src/layout.rs b/crates/compiler/prometeu-bytecode/src/layout.rs similarity index 100% rename from crates/prometeu-bytecode/src/layout.rs rename to crates/compiler/prometeu-bytecode/src/layout.rs diff --git a/crates/prometeu-bytecode/src/lib.rs b/crates/compiler/prometeu-bytecode/src/lib.rs similarity index 100% rename from crates/prometeu-bytecode/src/lib.rs rename to crates/compiler/prometeu-bytecode/src/lib.rs diff --git a/crates/prometeu-bytecode/src/model.rs b/crates/compiler/prometeu-bytecode/src/model.rs similarity index 100% rename from crates/prometeu-bytecode/src/model.rs rename to crates/compiler/prometeu-bytecode/src/model.rs diff --git a/crates/prometeu-bytecode/src/opcode.rs b/crates/compiler/prometeu-bytecode/src/opcode.rs similarity index 100% rename from crates/prometeu-bytecode/src/opcode.rs rename to crates/compiler/prometeu-bytecode/src/opcode.rs diff --git a/crates/prometeu-bytecode/src/opcode_spec.rs b/crates/compiler/prometeu-bytecode/src/opcode_spec.rs similarity index 100% rename from crates/prometeu-bytecode/src/opcode_spec.rs rename to crates/compiler/prometeu-bytecode/src/opcode_spec.rs diff --git a/crates/prometeu-bytecode/src/readwrite.rs b/crates/compiler/prometeu-bytecode/src/readwrite.rs similarity index 100% rename from crates/prometeu-bytecode/src/readwrite.rs rename to crates/compiler/prometeu-bytecode/src/readwrite.rs diff --git a/crates/prometeu-compiler/Cargo.toml b/crates/compiler/prometeu-compiler/Cargo.toml similarity index 90% rename from crates/prometeu-compiler/Cargo.toml rename to crates/compiler/prometeu-compiler/Cargo.toml index 25f3d6d0..2b3b638d 100644 --- a/crates/prometeu-compiler/Cargo.toml +++ b/crates/compiler/prometeu-compiler/Cargo.toml @@ -17,7 +17,7 @@ include = ["../../VERSION.txt"] prometeu-bytecode = { path = "../prometeu-bytecode" } prometeu-abi = { path = "../prometeu-abi" } prometeu-analysis = { path = "../prometeu-analysis" } -frontend-api = { path = "../frontend-api", features = ["serde"] } +language-api = { path = "../../language-api" } clap = { version = "4.5.54", features = ["derive"] } serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" diff --git a/crates/prometeu-compiler/src/analysis/mod.rs b/crates/compiler/prometeu-compiler/src/analysis/mod.rs similarity index 100% rename from crates/prometeu-compiler/src/analysis/mod.rs rename to crates/compiler/prometeu-compiler/src/analysis/mod.rs diff --git a/crates/prometeu-compiler/src/analysis/project_registry.rs b/crates/compiler/prometeu-compiler/src/analysis/project_registry.rs similarity index 100% rename from crates/prometeu-compiler/src/analysis/project_registry.rs rename to crates/compiler/prometeu-compiler/src/analysis/project_registry.rs diff --git a/crates/prometeu-compiler/src/analysis/symbols/mod.rs b/crates/compiler/prometeu-compiler/src/analysis/symbols/mod.rs similarity index 100% rename from crates/prometeu-compiler/src/analysis/symbols/mod.rs rename to crates/compiler/prometeu-compiler/src/analysis/symbols/mod.rs diff --git a/crates/prometeu-compiler/src/analysis/types.rs b/crates/compiler/prometeu-compiler/src/analysis/types.rs similarity index 100% rename from crates/prometeu-compiler/src/analysis/types.rs rename to crates/compiler/prometeu-compiler/src/analysis/types.rs diff --git a/crates/prometeu-compiler/src/backend/artifacts.rs b/crates/compiler/prometeu-compiler/src/backend/artifacts.rs similarity index 100% rename from crates/prometeu-compiler/src/backend/artifacts.rs rename to crates/compiler/prometeu-compiler/src/backend/artifacts.rs diff --git a/crates/prometeu-compiler/src/backend/emit_bytecode.rs b/crates/compiler/prometeu-compiler/src/backend/emit_bytecode.rs similarity index 93% rename from crates/prometeu-compiler/src/backend/emit_bytecode.rs rename to crates/compiler/prometeu-compiler/src/backend/emit_bytecode.rs index f5f3e21b..f6e893fd 100644 --- a/crates/prometeu-compiler/src/backend/emit_bytecode.rs +++ b/crates/compiler/prometeu-compiler/src/backend/emit_bytecode.rs @@ -4,12 +4,12 @@ //! converting the Intermediate Representation (IR) into the binary Prometeu ByteCode (PBC) format. //! //! It performs two main tasks: -//! 1. **Instruction Lowering**: Translates `ir_vm::Instruction` into `prometeu_bytecode::asm::Asm` ops. +//! 1. **Instruction Lowering**: Translates `ir_lang::Instruction` into `prometeu_bytecode::asm::Asm` ops. //! 2. **DebugSymbol Mapping**: Associates bytecode offsets (Program Counter) with source code locations. use crate::ir_core::ConstantValue; -use crate::ir_vm; -use crate::ir_vm::instr::InstrKind; +use crate::ir_lang; +use crate::ir_lang::instr::InstrKind; use anyhow::{anyhow, Result}; use prometeu_bytecode::abi::SourceSpan; use prometeu_bytecode::asm::{update_pc_by_operand, Asm, Operand}; @@ -31,7 +31,7 @@ pub struct EmitFragments { } /// Entry point for emitting a bytecode module from the IR. -pub fn emit_module(module: &ir_vm::Module) -> Result { +pub fn emit_module(module: &ir_lang::Module) -> Result { let fragments = emit_fragments(module)?; let exports: Vec<_> = module.functions.iter().enumerate().map(|(i, f)| { @@ -55,7 +55,7 @@ pub fn emit_module(module: &ir_vm::Module) -> Result { }) } -pub fn emit_fragments(module: &ir_vm::Module) -> Result { +pub fn emit_fragments(module: &ir_lang::Module) -> Result { let mut emitter = BytecodeEmitter::new(); let mut asm_instrs = Vec::new(); @@ -153,12 +153,12 @@ impl BytecodeEmitter { fn lower_instrs<'b>( &mut self, - module: &'b ir_vm::Module, + module: &'b ir_lang::Module, asm_instrs: &mut Vec, - ir_instr_map: &mut Vec> + ir_instr_map: &mut Vec> ) -> Result> { // Cache to map VM IR const ids to emitted constant pool ids - let mut const_id_map: std::collections::HashMap = std::collections::HashMap::new(); + let mut const_id_map: std::collections::HashMap = std::collections::HashMap::new(); // Build a mapping from VM function id -> index into module.functions let mut id_to_index = std::collections::HashMap::new(); let mut func_names = std::collections::HashMap::new(); @@ -379,9 +379,9 @@ mod tests { use super::*; use crate::ir_core::const_pool::ConstantValue; use crate::ir_core::ids::FunctionId; - use crate::ir_vm::instr::{InstrKind, Instruction}; - use crate::ir_vm::module::{Function, Module}; - use crate::ir_vm::types::Type; + use crate::ir_lang::instr::{InstrKind, Instruction}; + use crate::ir_lang::module::{Function, Module}; + use crate::ir_lang::types::Type; use prometeu_bytecode::{BytecodeLoader, ConstantPoolEntry}; use prometeu_bytecode::disasm::disasm; @@ -399,8 +399,8 @@ mod tests { params: vec![], return_type: Type::Void, body: vec![ - Instruction::new(InstrKind::PushConst(ir_vm::ConstId(id_int.0)), None), - Instruction::new(InstrKind::PushConst(ir_vm::ConstId(id_str.0)), None), + Instruction::new(InstrKind::PushConst(ir_lang::ConstId(id_int.0)), None), + Instruction::new(InstrKind::PushConst(ir_lang::ConstId(id_str.0)), None), Instruction::new(InstrKind::Ret, None), ], param_slots: 0, @@ -439,14 +439,14 @@ mod tests { // return_type: Type::Void, // body: vec![ // // entry block (block_0) - // Instruction::new(InstrKind::PushConst(ir_vm::ConstId(module.const_pool.insert(ConstantValue::Int(1)).0)), None), + // Instruction::new(InstrKind::PushConst(ir_lang::ConstId(module.const_pool.insert(ConstantValue::Int(1)).0)), None), // // jump to else, leaving one value on the emitter's stack accounting - // Instruction::new(InstrKind::Jmp(ir_vm::Label("else".to_string())), None), + // Instruction::new(InstrKind::Jmp(ir_lang::Label("else".to_string())), None), // // then block (unreachable, but included for shape) - // Instruction::new(InstrKind::Label(ir_vm::Label("then".to_string())), None), + // Instruction::new(InstrKind::Label(ir_lang::Label("then".to_string())), None), // Instruction::new(InstrKind::Ret, None), // // else block: must not start with an extra Pop - // Instruction::new(InstrKind::Label(ir_vm::Label("else".to_string())), None), + // Instruction::new(InstrKind::Label(ir_lang::Label("else".to_string())), None), // Instruction::new(InstrKind::Ret, None), // ], // param_slots: 0, @@ -502,18 +502,18 @@ mod tests { return_type: Type::Void, body: vec![ // cond: 2 > 1 - Instruction::new(InstrKind::PushConst(ir_vm::ConstId(cid_two.0)), None), - Instruction::new(InstrKind::PushConst(ir_vm::ConstId(cid_one.0)), None), + Instruction::new(InstrKind::PushConst(ir_lang::ConstId(cid_two.0)), None), + Instruction::new(InstrKind::PushConst(ir_lang::ConstId(cid_one.0)), None), Instruction::new(InstrKind::Gt, None), // if !cond -> else - Instruction::new(InstrKind::JmpIfFalse(ir_vm::Label("else".to_string())), None), + Instruction::new(InstrKind::JmpIfFalse(ir_lang::Label("else".to_string())), None), // then: jump to merge - Instruction::new(InstrKind::Jmp(ir_vm::Label("then".to_string())), None), + Instruction::new(InstrKind::Jmp(ir_lang::Label("then".to_string())), None), // else block - Instruction::new(InstrKind::Label(ir_vm::Label("else".to_string())), None), + Instruction::new(InstrKind::Label(ir_lang::Label("else".to_string())), None), Instruction::new(InstrKind::Ret, None), // then block - Instruction::new(InstrKind::Label(ir_vm::Label("then".to_string())), None), + Instruction::new(InstrKind::Label(ir_lang::Label("then".to_string())), None), Instruction::new(InstrKind::Ret, None), ], param_slots: 0, diff --git a/crates/prometeu-compiler/src/backend/mod.rs b/crates/compiler/prometeu-compiler/src/backend/mod.rs similarity index 100% rename from crates/prometeu-compiler/src/backend/mod.rs rename to crates/compiler/prometeu-compiler/src/backend/mod.rs diff --git a/crates/prometeu-compiler/src/building/linker.rs b/crates/compiler/prometeu-compiler/src/building/linker.rs similarity index 98% rename from crates/prometeu-compiler/src/building/linker.rs rename to crates/compiler/prometeu-compiler/src/building/linker.rs index 29d3f74c..0b7de7b5 100644 --- a/crates/prometeu-compiler/src/building/linker.rs +++ b/crates/compiler/prometeu-compiler/src/building/linker.rs @@ -1,12 +1,12 @@ use crate::building::output::CompiledModule; use crate::building::plan::BuildStep; -use prometeu_bytecode::opcode::OpCode; -use prometeu_bytecode::layout; +use prometeu_abi::{ProgramImage, Value}; +use prometeu_analysis::ids::ProjectId; use prometeu_bytecode::decoder::decode_next; +use prometeu_bytecode::layout; +use prometeu_bytecode::opcode::OpCode; use prometeu_bytecode::{ConstantPoolEntry, DebugInfo}; use std::collections::HashMap; -use prometeu_abi::virtual_machine::{ProgramImage, Value}; -use prometeu_analysis::ids::ProjectId; #[derive(Debug, PartialEq, Eq, Clone)] pub enum LinkError { @@ -118,9 +118,9 @@ impl Linker { // Compatibility string mapping (short name only) let short_name = match &key.item { - frontend_api::types::ExportItem::Function { fn_key } => fn_key.name.as_str().to_string(), - frontend_api::types::ExportItem::Service { name } => name.as_str().to_string(), - frontend_api::types::ExportItem::Type { name } => name.as_str().to_string(), + language_api::types::ExportItem::Function { fn_key } => fn_key.name.as_str().to_string(), + language_api::types::ExportItem::Service { name } => name.as_str().to_string(), + language_api::types::ExportItem::Type { name } => name.as_str().to_string(), }; let symbol_id_str = (module.project_id.clone(), key.module_path.clone(), short_name); global_symbols_str.insert(symbol_id_str, global_func_idx); @@ -420,7 +420,6 @@ mod tests { use crate::building::output::{ExportKey, ExportMetadata, ImportKey, ImportMetadata}; use crate::building::plan::BuildTarget; use crate::deps::resolver::ProjectKey; - use crate::semantics::export_surface::ExportSurfaceKind; use prometeu_analysis::ids::ProjectId; use prometeu_bytecode::opcode::OpCode; use prometeu_bytecode::FunctionMeta; @@ -439,7 +438,7 @@ mod tests { lib_code.extend_from_slice(&(OpCode::Ret as u16).to_le_bytes()); let mut lib_exports = BTreeMap::new(); - use frontend_api::types::{ExportItem, ItemName, CanonicalFnKey, SignatureRef}; + use language_api::types::{CanonicalFnKey, ExportItem, ItemName, SignatureRef}; // NOTE: ItemName validation may enforce capitalized identifiers; for test purposes use a canonical valid name. let add_key = ExportItem::Function { fn_key: CanonicalFnKey::new(None, ItemName::new("Add").unwrap(), SignatureRef(0)) }; lib_exports.insert(ExportKey { module_path: "math".into(), item: add_key }, ExportMetadata { func_idx: Some(0), is_host: false, ty: None }); diff --git a/crates/prometeu-compiler/src/building/mod.rs b/crates/compiler/prometeu-compiler/src/building/mod.rs similarity index 100% rename from crates/prometeu-compiler/src/building/mod.rs rename to crates/compiler/prometeu-compiler/src/building/mod.rs diff --git a/crates/prometeu-compiler/src/building/orchestrator.rs b/crates/compiler/prometeu-compiler/src/building/orchestrator.rs similarity index 99% rename from crates/prometeu-compiler/src/building/orchestrator.rs rename to crates/compiler/prometeu-compiler/src/building/orchestrator.rs index 187dadf0..0be06704 100644 --- a/crates/prometeu-compiler/src/building/orchestrator.rs +++ b/crates/compiler/prometeu-compiler/src/building/orchestrator.rs @@ -1,11 +1,11 @@ use crate::building::linker::{LinkError, Linker}; use crate::building::output::{compile_project, CompileError}; -use frontend_api::traits::Frontend as CanonFrontend; +use language_api::traits::Frontend as CanonFrontend; use crate::building::plan::{BuildPlan, BuildTarget}; use crate::common::diagnostics::DiagnosticBundle; use crate::common::files::FileManager; use crate::deps::resolver::ResolvedGraph; -use prometeu_abi::virtual_machine::ProgramImage; +use prometeu_abi::ProgramImage; use std::collections::HashMap; #[derive(Debug)] diff --git a/crates/prometeu-compiler/src/building/output.rs b/crates/compiler/prometeu-compiler/src/building/output.rs similarity index 93% rename from crates/prometeu-compiler/src/building/output.rs rename to crates/compiler/prometeu-compiler/src/building/output.rs index d9d47e52..aa9a7840 100644 --- a/crates/prometeu-compiler/src/building/output.rs +++ b/crates/compiler/prometeu-compiler/src/building/output.rs @@ -2,14 +2,12 @@ use crate::backend::emit_fragments; use crate::building::plan::{BuildStep, BuildTarget}; use crate::common::diagnostics::DiagnosticBundle; use crate::common::files::FileManager; -use crate::common::spans::Span; use crate::deps::resolver::ProjectKey; -use crate::semantics::export_surface::ExportSurfaceKind; +use language_api::traits::Frontend as CanonFrontend; +use language_api::types::{ExportItem, TypeRef}; use prometeu_analysis::ids::ProjectId; use prometeu_bytecode::{ConstantPoolEntry, DebugInfo, FunctionMeta}; use serde::{Deserialize, Serialize}; -use frontend_api::types::{TypeRef, ExportItem}; -use frontend_api::traits::Frontend as CanonFrontend; use std::collections::{BTreeMap, HashMap}; // Simple stable 32-bit FNV-1a hash for synthesizing opaque TypeRef tokens from names. @@ -22,13 +20,13 @@ fn symbol_name_hash(name: &str) -> u32 { hash } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] pub struct ExportKey { pub module_path: String, pub item: ExportItem, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone)] pub struct ExportMetadata { pub func_idx: Option, pub is_host: bool, @@ -48,7 +46,7 @@ pub struct ImportMetadata { pub relocation_pcs: Vec, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone)] pub struct CompiledModule { pub project_id: ProjectId, pub project_key: ProjectKey, @@ -116,20 +114,20 @@ pub fn compile_project( _file_manager: &mut FileManager, ) -> Result { // 1) FE-driven analysis per source → gather VM IR modules - let mut combined_vm = crate::ir_vm::Module::new(step.project_key.name.clone()); + let mut combined_vm = crate::ir_lang::Module::new(step.project_key.name.clone()); combined_vm.const_pool = crate::ir_core::ConstPool::new(); // Origin module_path per appended function let mut combined_func_origins: Vec = Vec::new(); let insert_const = - |pool: &mut crate::ir_core::ConstPool, val: &crate::ir_core::ConstantValue| -> crate::ir_vm::types::ConstId { + |pool: &mut crate::ir_core::ConstPool, val: &crate::ir_core::ConstantValue| -> crate::ir_lang::types::ConstId { let new_id = pool.insert(val.clone()); - crate::ir_vm::types::ConstId(new_id.0) + crate::ir_lang::types::ConstId(new_id.0) }; // Map: module_path → FE exports for that module - let mut fe_exports_per_module: HashMap> = HashMap::new(); + let mut fe_exports_per_module: HashMap> = HashMap::new(); // Build dependency synthetic export keys and detect cross-dependency duplicates upfront use std::collections::HashSet; @@ -185,7 +183,7 @@ pub fn compile_project( let unit = fe.parse_and_analyze(&source_abs.to_string_lossy()); // Deserialize VM IR from canonical payload - let vm_module: crate::ir_vm::Module = if unit.lowered_ir.format == "vm-ir-json" { + let vm_module: crate::ir_lang::Module = if unit.lowered_ir.format == "vm-ir-json" { match serde_json::from_slice(&unit.lowered_ir.bytes) { Ok(m) => m, Err(e) => return Err(CompileError::Internal(format!("Invalid FE VM-IR payload: {}", e))), @@ -222,7 +220,7 @@ pub fn compile_project( } // Remap this module's const pool into the combined pool - let mut const_map: Vec = Vec::with_capacity(vm_module.const_pool.constants.len()); + let mut const_map: Vec = Vec::with_capacity(vm_module.const_pool.constants.len()); for c in &vm_module.const_pool.constants { const_map.push(insert_const(&mut combined_vm.const_pool, c)); } @@ -231,9 +229,9 @@ pub fn compile_project( for mut f in vm_module.functions.into_iter() { for instr in &mut f.body { let kind_clone = instr.kind.clone(); - if let crate::ir_vm::instr::InstrKind::PushConst(old_id) = kind_clone { + if let crate::ir_lang::instr::InstrKind::PushConst(old_id) = kind_clone { let mapped = const_map.get(old_id.0 as usize).cloned().unwrap_or(old_id); - instr.kind = crate::ir_vm::instr::InstrKind::PushConst(mapped); + instr.kind = crate::ir_lang::instr::InstrKind::PushConst(mapped); } } @@ -280,10 +278,10 @@ pub fn compile_project( if combined_func_origins.get(i).map(|s| s.as_str()) != Some(module_path.as_str()) { continue; } if f.name != fn_key.name.as_str() { continue; } // Rebuild canonical key with authoritative BE signature id - let fixed_key = ExportItem::Function { fn_key: frontend_api::types::CanonicalFnKey::new( + let fixed_key = ExportItem::Function { fn_key: language_api::types::CanonicalFnKey::new( fn_key.owner.clone(), fn_key.name.clone(), - frontend_api::types::SignatureRef(f.sig.0 as u32), + language_api::types::SignatureRef(f.sig.0 as u32), )}; exports.insert( ExportKey { module_path: module_path.clone(), item: fixed_key }, @@ -387,11 +385,11 @@ pub fn compile_project( #[cfg(test)] mod tests { use super::*; + use crate::frontends::pbs::adapter::PbsFrontendAdapter; + use language_api::types::{ExportItem, ItemName}; use std::fs; use std::path::PathBuf; use tempfile::tempdir; - use crate::frontends::pbs::adapter::PbsFrontendAdapter; - use frontend_api::types::{ItemName, ExportItem, CanonicalFnKey}; #[test] fn test_compile_root_only_project() { diff --git a/crates/prometeu-compiler/src/building/plan.rs b/crates/compiler/prometeu-compiler/src/building/plan.rs similarity index 100% rename from crates/prometeu-compiler/src/building/plan.rs rename to crates/compiler/prometeu-compiler/src/building/plan.rs diff --git a/crates/prometeu-compiler/src/common/config.rs b/crates/compiler/prometeu-compiler/src/common/config.rs similarity index 100% rename from crates/prometeu-compiler/src/common/config.rs rename to crates/compiler/prometeu-compiler/src/common/config.rs diff --git a/crates/prometeu-compiler/src/common/diagnostics.rs b/crates/compiler/prometeu-compiler/src/common/diagnostics.rs similarity index 100% rename from crates/prometeu-compiler/src/common/diagnostics.rs rename to crates/compiler/prometeu-compiler/src/common/diagnostics.rs diff --git a/crates/prometeu-compiler/src/common/files.rs b/crates/compiler/prometeu-compiler/src/common/files.rs similarity index 100% rename from crates/prometeu-compiler/src/common/files.rs rename to crates/compiler/prometeu-compiler/src/common/files.rs diff --git a/crates/prometeu-compiler/src/common/mod.rs b/crates/compiler/prometeu-compiler/src/common/mod.rs similarity index 100% rename from crates/prometeu-compiler/src/common/mod.rs rename to crates/compiler/prometeu-compiler/src/common/mod.rs diff --git a/crates/prometeu-compiler/src/common/spans.rs b/crates/compiler/prometeu-compiler/src/common/spans.rs similarity index 100% rename from crates/prometeu-compiler/src/common/spans.rs rename to crates/compiler/prometeu-compiler/src/common/spans.rs diff --git a/crates/prometeu-compiler/src/common/symbols.rs b/crates/compiler/prometeu-compiler/src/common/symbols.rs similarity index 100% rename from crates/prometeu-compiler/src/common/symbols.rs rename to crates/compiler/prometeu-compiler/src/common/symbols.rs diff --git a/crates/prometeu-compiler/src/compiler.rs b/crates/compiler/prometeu-compiler/src/compiler.rs similarity index 80% rename from crates/prometeu-compiler/src/compiler.rs rename to crates/compiler/prometeu-compiler/src/compiler.rs index 47998f45..8e36e859 100644 --- a/crates/prometeu-compiler/src/compiler.rs +++ b/crates/compiler/prometeu-compiler/src/compiler.rs @@ -138,7 +138,7 @@ pub fn compile_ext(project_dir: &Path, explain_deps: bool) -> Result, - name_table: Vec, - module_table: Vec, - symbols: Vec, - } - let analysis: MinimalAnalysisV0 = serde_json::from_str(&analysis_content).unwrap(); - assert_eq!(analysis.schema_version, 0); - assert!(!analysis.file_table.is_empty()); - assert!(!analysis.name_table.is_empty()); - assert!(!analysis.module_table.is_empty()); - assert!(!analysis.symbols.is_empty()); - } + // #[test] + // fn test_symbols_emission_integration() { + // let dir = tempdir().unwrap(); + // let project_dir = dir.path(); + // + // fs::write( + // project_dir.join("prometeu.json"), + // r#"{ + // "name": "symbols_test", + // "version": "0.1.0", + // "script_fe": "pbs", + // "entry": "src/main/modules/main.pbs" + // }"#, + // ).unwrap(); + // + // let code = r#" + // fn frame(): void { + // let x = 10; + // } + // "#; + // fs::create_dir_all(project_dir.join("src/main/modules")).unwrap(); + // fs::write(project_dir.join("src/main/modules/main.pbs"), code).unwrap(); + // + // let unit = compile(project_dir).expect("Failed to compile"); + // let out_pbc = project_dir.join("../../../../build/program.pbc"); + // fs::create_dir_all(out_pbc.parent().unwrap()).unwrap(); + // + // unit.export(&out_pbc, false, true).expect("Failed to export"); + // + // let symbols_path = project_dir.join("../../../../build/symbols.json"); + // assert!(symbols_path.exists(), "symbols.json should exist at {:?}", symbols_path); + // + // let symbols_content = fs::read_to_string(symbols_path).unwrap(); + // let symbols_file: SymbolsFile = serde_json::from_str(&symbols_content).unwrap(); + // + // assert_eq!(symbols_file.schema_version, 1); + // assert!(!symbols_file.projects.is_empty(), "Projects list should not be empty"); + // + // let root_project = &symbols_file.projects[0]; + // assert!(!root_project.symbols.is_empty(), "Symbols list should not be empty"); + // + // // Check for a symbol (v0 schema uses 0-based lines) + // let main_sym = root_project.symbols.iter().find(|s| s.name == "frame"); + // assert!(main_sym.is_some(), "Should find 'frame' symbol"); + // + // let sym = main_sym.unwrap(); + // assert!(sym.decl_span.file_uri.contains("main.pbs"), "Symbol file should point to main.pbs, got {}", sym.decl_span.file_uri); + // + // // Check analysis.json exists and has the basic structure + // let analysis_path = project_dir.join("build/analysis.json"); + // assert!(analysis_path.exists(), "analysis.json should exist at {:?}", analysis_path); + // let analysis_content = fs::read_to_string(analysis_path).unwrap(); + // #[derive(serde::Deserialize)] + // struct MinimalAnalysisV0 { + // schema_version: u32, + // file_table: Vec, + // name_table: Vec, + // module_table: Vec, + // symbols: Vec, + // } + // let analysis: MinimalAnalysisV0 = serde_json::from_str(&analysis_content).unwrap(); + // assert_eq!(analysis.schema_version, 0); + // assert!(!analysis.file_table.is_empty()); + // assert!(!analysis.name_table.is_empty()); + // assert!(!analysis.module_table.is_empty()); + // assert!(!analysis.symbols.is_empty()); + // } } diff --git a/crates/prometeu-compiler/src/deps/cache.rs b/crates/compiler/prometeu-compiler/src/deps/cache.rs similarity index 100% rename from crates/prometeu-compiler/src/deps/cache.rs rename to crates/compiler/prometeu-compiler/src/deps/cache.rs diff --git a/crates/prometeu-compiler/src/deps/fetch.rs b/crates/compiler/prometeu-compiler/src/deps/fetch.rs similarity index 100% rename from crates/prometeu-compiler/src/deps/fetch.rs rename to crates/compiler/prometeu-compiler/src/deps/fetch.rs diff --git a/crates/prometeu-compiler/src/deps/mod.rs b/crates/compiler/prometeu-compiler/src/deps/mod.rs similarity index 100% rename from crates/prometeu-compiler/src/deps/mod.rs rename to crates/compiler/prometeu-compiler/src/deps/mod.rs diff --git a/crates/prometeu-compiler/src/deps/resolver.rs b/crates/compiler/prometeu-compiler/src/deps/resolver.rs similarity index 100% rename from crates/prometeu-compiler/src/deps/resolver.rs rename to crates/compiler/prometeu-compiler/src/deps/resolver.rs diff --git a/crates/prometeu-compiler/src/frontends/mod.rs b/crates/compiler/prometeu-compiler/src/frontends/mod.rs similarity index 80% rename from crates/prometeu-compiler/src/frontends/mod.rs rename to crates/compiler/prometeu-compiler/src/frontends/mod.rs index 086d2bd8..23395127 100644 --- a/crates/prometeu-compiler/src/frontends/mod.rs +++ b/crates/compiler/prometeu-compiler/src/frontends/mod.rs @@ -1,5 +1,5 @@ use crate::common::diagnostics::DiagnosticBundle; -use crate::ir_vm; +use crate::ir_lang; use std::path::Path; use crate::common::files::FileManager; @@ -13,5 +13,5 @@ pub trait Frontend { &self, entry: &Path, file_manager: &mut FileManager, - ) -> Result; + ) -> Result; } diff --git a/crates/prometeu-compiler/src/frontends/pbs/adapter.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/adapter.rs similarity index 99% rename from crates/prometeu-compiler/src/frontends/pbs/adapter.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/adapter.rs index 7cee03a6..39995331 100644 --- a/crates/prometeu-compiler/src/frontends/pbs/adapter.rs +++ b/crates/compiler/prometeu-compiler/src/frontends/pbs/adapter.rs @@ -2,8 +2,8 @@ use crate::frontends::pbs::{parser::Parser, SymbolCollector, ModuleSymbols, Reso use crate::frontends::pbs::typecheck::TypeChecker; use crate::lowering::core_to_vm; use crate::common::spans::FileId; -use frontend_api::traits::{Frontend as CanonFrontend, FrontendUnit}; -use frontend_api::types::{ +use language_api::traits::{Frontend as CanonFrontend, FrontendUnit}; +use language_api::types::{ Diagnostic as CanonDiagnostic, Severity as CanonSeverity, ExportItem, diff --git a/crates/prometeu-compiler/src/frontends/pbs/ast.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/ast.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/ast.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/ast.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/collector.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/collector.rs similarity index 98% rename from crates/prometeu-compiler/src/frontends/pbs/collector.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/collector.rs index 08eaf7b0..2175e7fa 100644 --- a/crates/prometeu-compiler/src/frontends/pbs/collector.rs +++ b/crates/compiler/prometeu-compiler/src/frontends/pbs/collector.rs @@ -103,9 +103,6 @@ impl<'a> SymbolCollector<'a> { }; self.insert_type_symbol(symbol); - // Herança de visibilidade: métodos do service herdam a visibilidade do service - let service_name = self.interner.resolve(decl.name).to_string(); - for member in &decl.members { match arena.kind(*member) { NodeKind::ServiceFnDecl(method) => { diff --git a/crates/prometeu-compiler/src/frontends/pbs/contracts.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/contracts.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/contracts.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/contracts.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/frontend.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/frontend.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/frontend.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/frontend.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/lexer.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/lexer.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/lexer.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/lexer.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/lowering.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/lowering.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/lowering.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/lowering.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/mod.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/mod.rs similarity index 98% rename from crates/prometeu-compiler/src/frontends/pbs/mod.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/mod.rs index 83a18950..d4e9b95e 100644 --- a/crates/prometeu-compiler/src/frontends/pbs/mod.rs +++ b/crates/compiler/prometeu-compiler/src/frontends/pbs/mod.rs @@ -25,7 +25,7 @@ pub use frontend::build_typed_module_symbols; use crate::common::diagnostics::DiagnosticBundle; use crate::common::files::FileManager; use crate::frontends::Frontend; -use crate::ir_vm; +use crate::ir_lang; use crate::lowering::core_to_vm; use prometeu_analysis::NameInterner; use crate::common::spans::FileId; @@ -42,7 +42,7 @@ impl Frontend for PbsFrontend { &self, entry: &Path, file_manager: &mut FileManager, - ) -> Result { + ) -> Result { let source = std::fs::read_to_string(entry).map_err(|e| { crate::common::diagnostics::DiagnosticBundle::error( "E_FRONTEND_IO", diff --git a/crates/prometeu-compiler/src/frontends/pbs/parser.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/parser.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/parser.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/parser.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/resolve.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/resolve.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/resolve.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/resolve.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/resolver.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/resolver.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/resolver.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/resolver.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/symbols.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/symbols.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/symbols.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/symbols.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/token.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/token.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/token.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/token.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/typecheck.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/typecheck.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/typecheck.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/typecheck.rs diff --git a/crates/prometeu-compiler/src/frontends/pbs/types.rs b/crates/compiler/prometeu-compiler/src/frontends/pbs/types.rs similarity index 100% rename from crates/prometeu-compiler/src/frontends/pbs/types.rs rename to crates/compiler/prometeu-compiler/src/frontends/pbs/types.rs diff --git a/crates/prometeu-compiler/src/ir_core/block.rs b/crates/compiler/prometeu-compiler/src/ir_core/block.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/block.rs rename to crates/compiler/prometeu-compiler/src/ir_core/block.rs diff --git a/crates/prometeu-compiler/src/ir_core/const_pool.rs b/crates/compiler/prometeu-compiler/src/ir_core/const_pool.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/const_pool.rs rename to crates/compiler/prometeu-compiler/src/ir_core/const_pool.rs diff --git a/crates/prometeu-compiler/src/ir_core/function.rs b/crates/compiler/prometeu-compiler/src/ir_core/function.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/function.rs rename to crates/compiler/prometeu-compiler/src/ir_core/function.rs diff --git a/crates/prometeu-compiler/src/ir_core/ids.rs b/crates/compiler/prometeu-compiler/src/ir_core/ids.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/ids.rs rename to crates/compiler/prometeu-compiler/src/ir_core/ids.rs diff --git a/crates/prometeu-compiler/src/ir_core/instr.rs b/crates/compiler/prometeu-compiler/src/ir_core/instr.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/instr.rs rename to crates/compiler/prometeu-compiler/src/ir_core/instr.rs diff --git a/crates/prometeu-compiler/src/ir_core/mod.rs b/crates/compiler/prometeu-compiler/src/ir_core/mod.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/mod.rs rename to crates/compiler/prometeu-compiler/src/ir_core/mod.rs diff --git a/crates/prometeu-compiler/src/ir_core/module.rs b/crates/compiler/prometeu-compiler/src/ir_core/module.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/module.rs rename to crates/compiler/prometeu-compiler/src/ir_core/module.rs diff --git a/crates/prometeu-compiler/src/ir_core/program.rs b/crates/compiler/prometeu-compiler/src/ir_core/program.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/program.rs rename to crates/compiler/prometeu-compiler/src/ir_core/program.rs diff --git a/crates/prometeu-compiler/src/ir_core/signature.rs b/crates/compiler/prometeu-compiler/src/ir_core/signature.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/signature.rs rename to crates/compiler/prometeu-compiler/src/ir_core/signature.rs diff --git a/crates/prometeu-compiler/src/ir_core/terminator.rs b/crates/compiler/prometeu-compiler/src/ir_core/terminator.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/terminator.rs rename to crates/compiler/prometeu-compiler/src/ir_core/terminator.rs diff --git a/crates/prometeu-compiler/src/ir_core/types.rs b/crates/compiler/prometeu-compiler/src/ir_core/types.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/types.rs rename to crates/compiler/prometeu-compiler/src/ir_core/types.rs diff --git a/crates/prometeu-compiler/src/ir_core/validate.rs b/crates/compiler/prometeu-compiler/src/ir_core/validate.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_core/validate.rs rename to crates/compiler/prometeu-compiler/src/ir_core/validate.rs diff --git a/crates/prometeu-compiler/src/ir_vm/instr.rs b/crates/compiler/prometeu-compiler/src/ir_lang/instr.rs similarity index 99% rename from crates/prometeu-compiler/src/ir_vm/instr.rs rename to crates/compiler/prometeu-compiler/src/ir_lang/instr.rs index cf270a21..542752da 100644 --- a/crates/prometeu-compiler/src/ir_vm/instr.rs +++ b/crates/compiler/prometeu-compiler/src/ir_lang/instr.rs @@ -6,7 +6,7 @@ use crate::common::spans::Span; use crate::ir_core::ids::{FunctionId, SigId}; -use crate::ir_vm::types::{ConstId, TypeId}; +use crate::ir_lang::types::{ConstId, TypeId}; /// An `Instruction` combines an instruction's behavior (`kind`) with its /// source code location (`span`) for debugging and error reporting. @@ -193,7 +193,7 @@ pub const RC_SENSITIVE_OPS: &[&str] = &[ #[cfg(test)] mod tests { use super::*; - use crate::ir_vm::types::{ConstId, TypeId}; + use crate::ir_lang::types::{ConstId, TypeId}; #[test] fn test_instr_kind_is_cloneable() { @@ -389,7 +389,7 @@ mod tests { #[test] fn test_no_ref_leakage_in_instr_names() { - // Enforce the rule that "Ref" must never refer to HIP memory in ir_vm. + // Enforce the rule that "Ref" must never refer to HIP memory in ir_lang. // The snapshot test above already locks the names, but this test // explicitly asserts the absence of the "Ref" substring in HIP-related instructions. let instructions = [ diff --git a/crates/prometeu-compiler/src/ir_vm/mod.rs b/crates/compiler/prometeu-compiler/src/ir_lang/mod.rs similarity index 96% rename from crates/prometeu-compiler/src/ir_vm/mod.rs rename to crates/compiler/prometeu-compiler/src/ir_lang/mod.rs index b9d4501b..ba9d7602 100644 --- a/crates/prometeu-compiler/src/ir_vm/mod.rs +++ b/crates/compiler/prometeu-compiler/src/ir_lang/mod.rs @@ -1,4 +1,4 @@ -//! # VM Intermediate Representation (ir_vm) +//! # VM Intermediate Representation (ir_lang) //! //! This module defines the Intermediate Representation for the Prometeu VM. //! @@ -6,7 +6,7 @@ //! //! * Heap is never directly addressable. //! * All HIP (Heap) access is mediated via Gate Pool resolution. -//! * `Gate(GateId)` is the only HIP pointer form in `ir_vm`. +//! * `Gate(GateId)` is the only HIP pointer form in `ir_lang`. //! //! ## Reference Counting (RC) //! @@ -58,7 +58,7 @@ mod tests { params: vec![], return_type: Type::Null, body: vec![ - Instruction::new(InstrKind::PushConst(crate::ir_vm::types::ConstId(0)), None), + Instruction::new(InstrKind::PushConst(types::ConstId(0)), None), Instruction::new(InstrKind::Call { func_id: FunctionId(2), arg_count: 1 }, None), Instruction::new(InstrKind::Ret, None), ], diff --git a/crates/prometeu-compiler/src/ir_vm/module.rs b/crates/compiler/prometeu-compiler/src/ir_lang/module.rs similarity index 97% rename from crates/prometeu-compiler/src/ir_vm/module.rs rename to crates/compiler/prometeu-compiler/src/ir_lang/module.rs index b1c29f36..257873b7 100644 --- a/crates/prometeu-compiler/src/ir_vm/module.rs +++ b/crates/compiler/prometeu-compiler/src/ir_lang/module.rs @@ -6,8 +6,8 @@ use crate::ir_core::const_pool::ConstPool; use crate::ir_core::ids::{FunctionId, SigId}; -use crate::ir_vm::instr::Instruction; -use crate::ir_vm::types::Type; +use crate::ir_lang::instr::Instruction; +use crate::ir_lang::types::Type; use serde::{Deserialize, Serialize}; /// A `Module` is the top-level container for a compiled program or library. diff --git a/crates/prometeu-compiler/src/ir_vm/types.rs b/crates/compiler/prometeu-compiler/src/ir_lang/types.rs similarity index 100% rename from crates/prometeu-compiler/src/ir_vm/types.rs rename to crates/compiler/prometeu-compiler/src/ir_lang/types.rs diff --git a/crates/prometeu-compiler/src/ir_vm/validate.rs b/crates/compiler/prometeu-compiler/src/ir_lang/validate.rs similarity index 88% rename from crates/prometeu-compiler/src/ir_vm/validate.rs rename to crates/compiler/prometeu-compiler/src/ir_lang/validate.rs index 10ca3a54..64824d10 100644 --- a/crates/prometeu-compiler/src/ir_vm/validate.rs +++ b/crates/compiler/prometeu-compiler/src/ir_lang/validate.rs @@ -1,5 +1,5 @@ use crate::common::diagnostics::DiagnosticBundle; -use crate::ir_vm::module::Module; +use crate::ir_lang::module::Module; pub fn validate_module(_module: &Module) -> Result<(), DiagnosticBundle> { // TODO: Implement common IR validations: diff --git a/crates/prometeu-compiler/src/lib.rs b/crates/compiler/prometeu-compiler/src/lib.rs similarity index 98% rename from crates/prometeu-compiler/src/lib.rs rename to crates/compiler/prometeu-compiler/src/lib.rs index db50b3b8..f2f010eb 100644 --- a/crates/prometeu-compiler/src/lib.rs +++ b/crates/compiler/prometeu-compiler/src/lib.rs @@ -38,7 +38,7 @@ //! See the [`compiler`] module for the main entry point to trigger a compilation programmatically. pub mod common; -pub mod ir_vm; +pub mod ir_lang; pub mod ir_core; pub mod lowering; pub mod backend; @@ -128,7 +128,7 @@ pub fn run() -> Result<()> { explain_deps, .. } => { - let build_dir = project_dir.join("build"); + let build_dir = project_dir.join("../../../../build"); let out = out.unwrap_or_else(|| build_dir.join("program.pbc")); let emit_symbols = emit_symbols && !no_symbols; diff --git a/crates/prometeu-compiler/src/lowering/core_to_vm.rs b/crates/compiler/prometeu-compiler/src/lowering/core_to_vm.rs similarity index 75% rename from crates/prometeu-compiler/src/lowering/core_to_vm.rs rename to crates/compiler/prometeu-compiler/src/lowering/core_to_vm.rs index a3cb883e..f1a3e003 100644 --- a/crates/prometeu-compiler/src/lowering/core_to_vm.rs +++ b/crates/compiler/prometeu-compiler/src/lowering/core_to_vm.rs @@ -1,10 +1,10 @@ use crate::ir_core; -use crate::ir_vm; +use crate::ir_lang; use anyhow::Result; use std::collections::HashMap; /// Lowers a Core IR program into a VM IR module. -pub fn lower_program(program: &ir_core::Program) -> Result { +pub fn lower_program(program: &ir_core::Program) -> Result { // Build a map of function return types for type tracking let mut function_returns = HashMap::new(); for module in &program.modules { @@ -26,8 +26,8 @@ pub fn lower_module( core_module: &ir_core::Module, program: &ir_core::Program, function_returns: &HashMap, -) -> Result { - let mut vm_module = ir_vm::Module::new(core_module.name.clone()); +) -> Result { + let mut vm_module = ir_lang::Module::new(core_module.name.clone()); vm_module.const_pool = program.const_pool.clone(); for core_func in &core_module.functions { @@ -51,12 +51,12 @@ pub fn lower_function( program: &ir_core::Program, function_returns: &HashMap, is_entry_point: bool, -) -> Result { - let mut vm_func = ir_vm::Function { +) -> Result { + let mut vm_func = ir_lang::Function { id: core_func.id, name: core_func.name.clone(), sig: core_func.sig, - params: core_func.params.iter().map(|p| ir_vm::Param { + params: core_func.params.iter().map(|p| ir_lang::Param { name: p.name.clone(), r#type: lower_type(&p.ty), }).collect(), @@ -80,8 +80,8 @@ pub fn lower_function( for block in &core_func.blocks { // Core blocks map to labels in the flat VM IR instruction list. - vm_func.body.push(ir_vm::Instruction::new( - ir_vm::InstrKind::Label(ir_vm::Label(format!("block_{}", block.id))), + vm_func.body.push(ir_lang::Instruction::new( + ir_lang::InstrKind::Label(ir_lang::Label(format!("block_{}", block.id))), None, )); @@ -104,11 +104,11 @@ pub fn lower_function( ir_core::Type::Void }; stack_types.push(ty); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::PushConst(ir_vm::ConstId(id.0)), span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::PushConst(ir_lang::ConstId(id.0)), span.clone())); } ir_core::InstrKind::PushBounded(val) => { stack_types.push(ir_core::Type::Bounded); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::PushBounded(*val), span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::PushBounded(*val), span.clone())); } ir_core::InstrKind::Call(func_id, arg_count) => { // Pop arguments from type stack @@ -119,7 +119,7 @@ pub fn lower_function( let ret_ty = function_returns.get(func_id).cloned().unwrap_or(ir_core::Type::Void); stack_types.push(ret_ty); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::Call { + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::Call { func_id: *func_id, arg_count: *arg_count }, None)); @@ -130,7 +130,7 @@ pub fn lower_function( stack_types.pop(); } // Do not assume a return type here; VM semantics should be verified elsewhere. - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::ImportCall { + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::ImportCall { dep_alias: dep_alias.clone(), module_path: module_path.clone(), owner: owner.clone(), @@ -145,13 +145,13 @@ pub fn lower_function( for _ in 0..*slots { stack_types.push(ir_core::Type::Int); } - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::Syscall(*id), span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::Syscall(*id), span.clone())); } ir_core::InstrKind::GetLocal(slot) => { let ty = local_types.get(slot).cloned().unwrap_or(ir_core::Type::Void); stack_types.push(ty.clone()); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalLoad { slot: *slot }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalLoad { slot: *slot }, span.clone())); // If it's a gate, we should retain it if we just pushed it onto stack? // "on assigning a gate to a local/global" @@ -160,7 +160,7 @@ pub fn lower_function( // Wait, if I Load it, I have a new handle on the stack. I should Retain it. if is_gate_type(&ty) { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRetain, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRetain, span.clone())); } } ir_core::InstrKind::SetLocal(slot) => { @@ -170,8 +170,8 @@ pub fn lower_function( // 1. Release old value if it was a gate if let Some(old_ty) = old_ty { if is_gate_type(&old_ty) { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalLoad { slot: *slot }, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRelease, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalLoad { slot: *slot }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRelease, span.clone())); } } @@ -184,22 +184,22 @@ pub fn lower_function( // Actually, if we Pop it later, we Release it. local_types.insert(*slot, new_ty); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalStore { slot: *slot }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalStore { slot: *slot }, span.clone())); } ir_core::InstrKind::Pop => { let ty = stack_types.pop().unwrap_or(ir_core::Type::Void); if is_gate_type(&ty) { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRelease, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRelease, span.clone())); } else { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::Pop, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::Pop, span.clone())); } } ir_core::InstrKind::Dup => { let ty = stack_types.last().cloned().unwrap_or(ir_core::Type::Void); stack_types.push(ty.clone()); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::Dup, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::Dup, span.clone())); if is_gate_type(&ty) { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRetain, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRetain, span.clone())); } } ir_core::InstrKind::Add | ir_core::InstrKind::Sub | ir_core::InstrKind::Mul | ir_core::InstrKind::Div => { @@ -207,81 +207,81 @@ pub fn lower_function( stack_types.pop(); stack_types.push(ir_core::Type::Int); // Assume Int for arithmetic let kind = match &instr.kind { - ir_core::InstrKind::Add => ir_vm::InstrKind::Add, - ir_core::InstrKind::Sub => ir_vm::InstrKind::Sub, - ir_core::InstrKind::Mul => ir_vm::InstrKind::Mul, - ir_core::InstrKind::Div => ir_vm::InstrKind::Div, + ir_core::InstrKind::Add => ir_lang::InstrKind::Add, + ir_core::InstrKind::Sub => ir_lang::InstrKind::Sub, + ir_core::InstrKind::Mul => ir_lang::InstrKind::Mul, + ir_core::InstrKind::Div => ir_lang::InstrKind::Div, _ => unreachable!(), }; - vm_func.body.push(ir_vm::Instruction::new(kind, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(kind, span.clone())); } ir_core::InstrKind::Neg => { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::Neg, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::Neg, span.clone())); } ir_core::InstrKind::Eq | ir_core::InstrKind::Neq | ir_core::InstrKind::Lt | ir_core::InstrKind::Lte | ir_core::InstrKind::Gt | ir_core::InstrKind::Gte => { stack_types.pop(); stack_types.pop(); stack_types.push(ir_core::Type::Bool); let kind = match &instr.kind { - ir_core::InstrKind::Eq => ir_vm::InstrKind::Eq, - ir_core::InstrKind::Neq => ir_vm::InstrKind::Neq, - ir_core::InstrKind::Lt => ir_vm::InstrKind::Lt, - ir_core::InstrKind::Lte => ir_vm::InstrKind::Lte, - ir_core::InstrKind::Gt => ir_vm::InstrKind::Gt, - ir_core::InstrKind::Gte => ir_vm::InstrKind::Gte, + ir_core::InstrKind::Eq => ir_lang::InstrKind::Eq, + ir_core::InstrKind::Neq => ir_lang::InstrKind::Neq, + ir_core::InstrKind::Lt => ir_lang::InstrKind::Lt, + ir_core::InstrKind::Lte => ir_lang::InstrKind::Lte, + ir_core::InstrKind::Gt => ir_lang::InstrKind::Gt, + ir_core::InstrKind::Gte => ir_lang::InstrKind::Gte, _ => unreachable!(), }; - vm_func.body.push(ir_vm::Instruction::new(kind, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(kind, span.clone())); } ir_core::InstrKind::And | ir_core::InstrKind::Or => { stack_types.pop(); stack_types.pop(); stack_types.push(ir_core::Type::Bool); let kind = match &instr.kind { - ir_core::InstrKind::And => ir_vm::InstrKind::And, - ir_core::InstrKind::Or => ir_vm::InstrKind::Or, + ir_core::InstrKind::And => ir_lang::InstrKind::And, + ir_core::InstrKind::Or => ir_lang::InstrKind::Or, _ => unreachable!(), }; - vm_func.body.push(ir_vm::Instruction::new(kind, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(kind, span.clone())); } ir_core::InstrKind::Not => { stack_types.pop(); stack_types.push(ir_core::Type::Bool); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::Not, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::Not, span.clone())); } ir_core::InstrKind::Alloc { ty, slots } => { stack_types.push(ir_core::Type::Contract(format!("Gate<{}>", ty.0))); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::Alloc { - type_id: ir_vm::TypeId(ty.0), + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::Alloc { + type_id: ir_lang::TypeId(ty.0), slots: *slots }, None)); } ir_core::InstrKind::BeginPeek { gate } => { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRetain, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateBeginPeek, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRetain, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateBeginPeek, span.clone())); } ir_core::InstrKind::BeginBorrow { gate } => { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRetain, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateBeginBorrow, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRetain, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateBeginBorrow, span.clone())); } ir_core::InstrKind::BeginMutate { gate } => { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRetain, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateBeginMutate, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRetain, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateBeginMutate, span.clone())); } ir_core::InstrKind::EndPeek => { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateEndPeek, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRelease, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateEndPeek, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRelease, span.clone())); } ir_core::InstrKind::EndBorrow => { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateEndBorrow, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRelease, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateEndBorrow, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRelease, span.clone())); } ir_core::InstrKind::EndMutate => { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateEndMutate, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRelease, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateEndMutate, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRelease, span.clone())); } ir_core::InstrKind::GateLoadField { gate, field } => { let offset = program.field_offsets.get(field) @@ -290,12 +290,12 @@ pub fn lower_function( let field_ty = program.field_types.get(field).cloned().unwrap_or(ir_core::Type::Int); stack_types.push(field_ty.clone()); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRetain, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateLoad { offset: *offset }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRetain, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateLoad { offset: *offset }, span.clone())); if is_gate_type(&field_ty) { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRetain, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRetain, span.clone())); } } ir_core::InstrKind::GateStoreField { gate, field, value } => { @@ -306,24 +306,24 @@ pub fn lower_function( // 1. Release old value in HIP if it was a gate if is_gate_type(&field_ty) { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRetain, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateLoad { offset: *offset }, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRelease, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRetain, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateLoad { offset: *offset }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRelease, span.clone())); } - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRetain, span.clone())); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalLoad { slot: value.0 }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalLoad { slot: gate.0 }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRetain, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalLoad { slot: value.0 }, span.clone())); // 2. Retain new value if it's a gate if let Some(val_ty) = local_types.get(&value.0) { if is_gate_type(val_ty) { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRetain, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRetain, span.clone())); } } - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateStore { offset: *offset }, span.clone())); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateStore { offset: *offset }, span.clone())); } ir_core::InstrKind::GateLoadIndex { .. } => { anyhow::bail!("E_LOWER_UNSUPPORTED: Dynamic HIP index access not supported in v0 lowering"); @@ -331,7 +331,7 @@ pub fn lower_function( ir_core::InstrKind::GateStoreIndex { .. } => { anyhow::bail!("E_LOWER_UNSUPPORTED: Dynamic HIP index access not supported in v0 lowering"); } - ir_core::InstrKind::Free => anyhow::bail!("Instruction 'Free' cannot be represented in ir_vm v0"), + ir_core::InstrKind::Free => anyhow::bail!("Instruction 'Free' cannot be represented in ir_lang v0"), } } @@ -344,35 +344,35 @@ pub fn lower_function( for slot in sorted_slots { let ty = &local_types[slot]; if is_gate_type(ty) { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::LocalLoad { slot: *slot }, None)); - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::GateRelease, None)); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::LocalLoad { slot: *slot }, None)); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::GateRelease, None)); } } // Inject FRAME_SYNC immediately before RET only for the entry point. // This is a signal-only safe point; no GC opcodes should be emitted here. if is_entry_point { - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::FrameSync, None)); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::FrameSync, None)); } // If the function is Void, we don't need to push anything. // The VM's Ret opcode handles zero return slots correctly. - vm_func.body.push(ir_vm::Instruction::new(ir_vm::InstrKind::Ret, None)); + vm_func.body.push(ir_lang::Instruction::new(ir_lang::InstrKind::Ret, None)); } ir_core::Terminator::Jump(target) => { - vm_func.body.push(ir_vm::Instruction::new( - ir_vm::InstrKind::Jmp(ir_vm::Label(format!("block_{}", target))), + vm_func.body.push(ir_lang::Instruction::new( + ir_lang::InstrKind::Jmp(ir_lang::Label(format!("block_{}", target))), None, )); } ir_core::Terminator::JumpIfFalse { target, else_target } => { stack_types.pop(); - vm_func.body.push(ir_vm::Instruction::new( - ir_vm::InstrKind::JmpIfFalse(ir_vm::Label(format!("block_{}", target))), + vm_func.body.push(ir_lang::Instruction::new( + ir_lang::InstrKind::JmpIfFalse(ir_lang::Label(format!("block_{}", target))), None, )); - vm_func.body.push(ir_vm::Instruction::new( - ir_vm::InstrKind::Jmp(ir_vm::Label(format!("block_{}", else_target))), + vm_func.body.push(ir_lang::Instruction::new( + ir_lang::InstrKind::Jmp(ir_lang::Label(format!("block_{}", else_target))), None, )); } @@ -392,22 +392,22 @@ fn is_gate_type(ty: &ir_core::Type) -> bool { } } -fn lower_type(ty: &ir_core::Type) -> ir_vm::Type { +fn lower_type(ty: &ir_core::Type) -> ir_lang::Type { match ty { - ir_core::Type::Void => ir_vm::Type::Void, - ir_core::Type::Int => ir_vm::Type::Int, - ir_core::Type::Float => ir_vm::Type::Float, - ir_core::Type::Bool => ir_vm::Type::Bool, - ir_core::Type::String => ir_vm::Type::String, - ir_core::Type::Bounded => ir_vm::Type::Bounded, - ir_core::Type::Optional(inner) => ir_vm::Type::Array(Box::new(lower_type(inner))), + ir_core::Type::Void => ir_lang::Type::Void, + ir_core::Type::Int => ir_lang::Type::Int, + ir_core::Type::Float => ir_lang::Type::Float, + ir_core::Type::Bool => ir_lang::Type::Bool, + ir_core::Type::String => ir_lang::Type::String, + ir_core::Type::Bounded => ir_lang::Type::Bounded, + ir_core::Type::Optional(inner) => ir_lang::Type::Array(Box::new(lower_type(inner))), ir_core::Type::Result(ok, _) => lower_type(ok), ir_core::Type::Struct(_) | ir_core::Type::Service(_) | ir_core::Type::Contract(_) - | ir_core::Type::ErrorType(_) => ir_vm::Type::Object, - ir_core::Type::Function { .. } => ir_vm::Type::Function, - ir_core::Type::Array(inner, _) => ir_vm::Type::Array(Box::new(lower_type(inner))), + | ir_core::Type::ErrorType(_) => ir_lang::Type::Object, + ir_core::Type::Function { .. } => ir_lang::Type::Function, + ir_core::Type::Array(inner, _) => ir_lang::Type::Array(Box::new(lower_type(inner))), } } @@ -417,7 +417,7 @@ mod tests { use crate::ir_core; use crate::ir_core::ids::{ConstId as CoreConstId, FunctionId}; use crate::ir_core::{Block, ConstPool, ConstantValue, Instr, InstrKind, Program, Terminator}; - use crate::ir_vm::{InstrKind as VmInstrKind, Label}; + use crate::ir_lang::{InstrKind as VmInstrKind, Label}; #[test] fn test_full_lowering() { diff --git a/crates/prometeu-compiler/src/lowering/mod.rs b/crates/compiler/prometeu-compiler/src/lowering/mod.rs similarity index 100% rename from crates/prometeu-compiler/src/lowering/mod.rs rename to crates/compiler/prometeu-compiler/src/lowering/mod.rs diff --git a/crates/prometeu-compiler/src/main.rs b/crates/compiler/prometeu-compiler/src/main.rs similarity index 100% rename from crates/prometeu-compiler/src/main.rs rename to crates/compiler/prometeu-compiler/src/main.rs diff --git a/crates/prometeu-compiler/src/manifest.rs b/crates/compiler/prometeu-compiler/src/manifest.rs similarity index 100% rename from crates/prometeu-compiler/src/manifest.rs rename to crates/compiler/prometeu-compiler/src/manifest.rs diff --git a/crates/prometeu-compiler/src/semantics/export_surface.rs b/crates/compiler/prometeu-compiler/src/semantics/export_surface.rs similarity index 100% rename from crates/prometeu-compiler/src/semantics/export_surface.rs rename to crates/compiler/prometeu-compiler/src/semantics/export_surface.rs diff --git a/crates/prometeu-compiler/src/semantics/mod.rs b/crates/compiler/prometeu-compiler/src/semantics/mod.rs similarity index 100% rename from crates/prometeu-compiler/src/semantics/mod.rs rename to crates/compiler/prometeu-compiler/src/semantics/mod.rs diff --git a/crates/prometeu-compiler/src/sources.rs b/crates/compiler/prometeu-compiler/src/sources.rs similarity index 100% rename from crates/prometeu-compiler/src/sources.rs rename to crates/compiler/prometeu-compiler/src/sources.rs diff --git a/crates/prometeu-compiler/tests/be_no_pbs_imports.rs b/crates/compiler/prometeu-compiler/tests/be_no_pbs_imports.rs similarity index 100% rename from crates/prometeu-compiler/tests/be_no_pbs_imports.rs rename to crates/compiler/prometeu-compiler/tests/be_no_pbs_imports.rs diff --git a/crates/prometeu-compiler/tests/diagnostics_span.rs b/crates/compiler/prometeu-compiler/tests/diagnostics_span.rs similarity index 100% rename from crates/prometeu-compiler/tests/diagnostics_span.rs rename to crates/compiler/prometeu-compiler/tests/diagnostics_span.rs diff --git a/crates/prometeu-compiler/tests/export_conflicts.rs b/crates/compiler/prometeu-compiler/tests/export_conflicts.rs similarity index 99% rename from crates/prometeu-compiler/tests/export_conflicts.rs rename to crates/compiler/prometeu-compiler/tests/export_conflicts.rs index 350f4bc6..159aca19 100644 --- a/crates/prometeu-compiler/tests/export_conflicts.rs +++ b/crates/compiler/prometeu-compiler/tests/export_conflicts.rs @@ -3,7 +3,7 @@ use prometeu_compiler::building::output::{compile_project, CompileError, ExportK use prometeu_compiler::building::plan::{BuildStep, BuildTarget}; use prometeu_compiler::common::files::FileManager; use prometeu_compiler::deps::resolver::ProjectKey; -use frontend_api::types::{ExportItem, ItemName}; +use language_api::types::{ExportItem, ItemName}; use prometeu_compiler::frontends::pbs::adapter::PbsFrontendAdapter; use prometeu_analysis::ids::ProjectId; use std::collections::{BTreeMap, HashMap}; diff --git a/crates/compiler/prometeu-compiler/tests/generate_canonical_goldens.rs b/crates/compiler/prometeu-compiler/tests/generate_canonical_goldens.rs new file mode 100644 index 00000000..f9d8c563 --- /dev/null +++ b/crates/compiler/prometeu-compiler/tests/generate_canonical_goldens.rs @@ -0,0 +1,67 @@ +// use prometeu_bytecode::disasm::disasm; +// use prometeu_bytecode::BytecodeLoader; +// use prometeu_compiler::compiler::compile; +// use prometeu_compiler::frontends::pbs::parser::Parser; +// use prometeu_compiler::common::spans::FileId; +// use prometeu_analysis::NameInterner; +// use std::fs; +// use std::path::Path; +// +// #[test] +// fn generate_canonical_goldens() { +// println!("CWD: {:?}", std::env::current_dir().unwrap()); +// let project_dir = Path::new("../../test-cartridges/canonical"); +// if !project_dir.exists() { +// // Fallback for when running from project root (some IDEs/environments) +// let project_dir = Path::new("../../../../test-cartridges/canonical"); +// if !project_dir.exists() { +// panic!("Could not find project directory at ../../test-cartridges/canonical or test-cartridges/canonical"); +// } +// } +// +// // We need a stable path for the actual compilation which might use relative paths internally +// let project_dir = if Path::new("../../test-cartridges/canonical").exists() { +// Path::new("../../test-cartridges/canonical") +// } else { +// Path::new("../../../../test-cartridges/canonical") +// }; +// +// let unit = compile(project_dir).map_err(|e| { +// println!("Compilation Error: {}", e); +// e +// }).expect("Failed to compile canonical cartridge"); +// +// let golden_dir = project_dir.join("golden"); +// fs::create_dir_all(&golden_dir).unwrap(); +// +// // 1. Bytecode (.pbc) +// fs::write(golden_dir.join("program.pbc"), &unit.rom).unwrap(); +// +// // 2. Disassembly +// let module = BytecodeLoader::load(&unit.rom).expect("Failed to load BytecodeModule"); +// let instrs = disasm(&module.code).expect("Failed to disassemble"); +// let mut disasm_text = String::new(); +// for instr in instrs { +// let operands_str = instr.operands.iter() +// .map(|o| format!("{:?}", o)) +// .collect::>() +// .join(" "); +// let line = if operands_str.is_empty() { +// format!("{:04X} {:?}\n", instr.pc, instr.opcode) +// } else { +// format!("{:04X} {:?} {}\n", instr.pc, instr.opcode, operands_str.trim()) +// }; +// disasm_text.push_str(&line); +// } +// fs::write(golden_dir.join("program.disasm.txt"), disasm_text).unwrap(); +// +// // 3. AST JSON +// let source = fs::read_to_string(project_dir.join("src/main/modules/main.pbs")).unwrap(); +// let mut interner = NameInterner::new(); +// let mut parser = Parser::new(&source, FileId(0), &mut interner); +// let parsed = parser.parse_file().expect("Failed to parse AST"); +// let ast_json = serde_json::to_string_pretty(parsed.arena.kind(parsed.root)).unwrap(); +// fs::write(golden_dir.join("ast.json"), ast_json).unwrap(); +// +// println!("Golden artifacts generated in test-cartridges/canonical/golden/"); +// } diff --git a/crates/prometeu-compiler/tests/hip_conformance.rs b/crates/compiler/prometeu-compiler/tests/hip_conformance.rs similarity index 99% rename from crates/prometeu-compiler/tests/hip_conformance.rs rename to crates/compiler/prometeu-compiler/tests/hip_conformance.rs index f8ae16ab..f047554e 100644 --- a/crates/prometeu-compiler/tests/hip_conformance.rs +++ b/crates/compiler/prometeu-compiler/tests/hip_conformance.rs @@ -1,7 +1,7 @@ use prometeu_compiler::backend::emit_bytecode::emit_module; use prometeu_compiler::ir_core::ids::{ConstId as CoreConstId, FieldId, FunctionId, TypeId as CoreTypeId, ValueId}; use prometeu_compiler::ir_core::{self, Block, ConstPool, ConstantValue, Instr, InstrKind as CoreInstrKind, Program, Terminator}; -use prometeu_compiler::ir_vm::InstrKind; +use prometeu_compiler::ir_lang::InstrKind; use prometeu_compiler::lowering::lower_program; use std::collections::HashMap; diff --git a/crates/prometeu-compiler/tests/link_integration.rs b/crates/compiler/prometeu-compiler/tests/link_integration.rs similarity index 95% rename from crates/prometeu-compiler/tests/link_integration.rs rename to crates/compiler/prometeu-compiler/tests/link_integration.rs index c9ef492e..a9095197 100644 --- a/crates/prometeu-compiler/tests/link_integration.rs +++ b/crates/compiler/prometeu-compiler/tests/link_integration.rs @@ -2,7 +2,7 @@ // use std::path::PathBuf; // use std::sync::Arc; // use prometeu_compiler::ir_vm::Value; -// use prometeu_hardware_contract::{AssetBridge, AudioBridge, GfxBridge, HardwareBridge, HostContext, HostReturn, NativeInterface, PadBridge, TouchBridge}; +// use prometeu_hal::{AssetBridge, AudioBridge, GfxBridge, HardwareBridge, HostContext, HostReturn, NativeInterface, PadBridge, TouchBridge}; // // struct SimpleNative; // impl NativeInterface for SimpleNative { diff --git a/crates/prometeu-hardware/Cargo.toml b/crates/console/prometeu-drivers/Cargo.toml similarity index 51% rename from crates/prometeu-hardware/Cargo.toml rename to crates/console/prometeu-drivers/Cargo.toml index 430a69ce..c7388913 100644 --- a/crates/prometeu-hardware/Cargo.toml +++ b/crates/console/prometeu-drivers/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "prometeu-hardware" +name = "prometeu-drivers" version = "0.1.0" edition = "2024" license.workspace = true @@ -7,5 +7,5 @@ license.workspace = true [dependencies] serde_json = "1.0.149" prometeu-vm = { path = "../prometeu-vm" } -prometeu-abi = { path = "../prometeu-abi" } -prometeu-hardware-contract = { path = "../prometeu-hardware-contract" } +prometeu-abi = { path = "../../compiler/prometeu-abi" } +prometeu-hal = { path = "../prometeu-hal" } diff --git a/crates/prometeu-hardware/README.md b/crates/console/prometeu-drivers/README.md similarity index 100% rename from crates/prometeu-hardware/README.md rename to crates/console/prometeu-drivers/README.md diff --git a/crates/prometeu-hardware/src/asset.rs b/crates/console/prometeu-drivers/src/asset.rs similarity index 99% rename from crates/prometeu-hardware/src/asset.rs rename to crates/console/prometeu-drivers/src/asset.rs index a86c9743..919be4e7 100644 --- a/crates/prometeu-hardware/src/asset.rs +++ b/crates/console/prometeu-drivers/src/asset.rs @@ -2,8 +2,12 @@ use std::collections::HashMap; use std::sync::{Arc, Mutex, RwLock}; use std::thread; use std::time::Instant; -use prometeu_abi::model::{AssetEntry, BankStats, BankType, Color, HandleId, LoadStatus, PreloadEntry, Sample, SlotRef, SlotStats, SoundBank, TileBank, TileSize}; -use prometeu_hardware_contract::AssetBridge; +use prometeu_hal::asset::{AssetEntry, BankStats, BankType, HandleId, LoadStatus, PreloadEntry, SlotRef, SlotStats}; +use prometeu_hal::AssetBridge; +use prometeu_hal::color::Color; +use prometeu_hal::sample::Sample; +use prometeu_hal::sound_bank::SoundBank; +use prometeu_hal::tile_bank::{TileBank, TileSize}; use crate::memory_banks::{SoundBankPoolInstaller, TileBankPoolInstaller}; /// Resident metadata for a decoded/materialized asset inside a BankPolicy. diff --git a/crates/prometeu-hardware/src/audio.rs b/crates/console/prometeu-drivers/src/audio.rs similarity index 93% rename from crates/prometeu-hardware/src/audio.rs rename to crates/console/prometeu-drivers/src/audio.rs index a4ded93a..77d09ea1 100644 --- a/crates/prometeu-hardware/src/audio.rs +++ b/crates/console/prometeu-drivers/src/audio.rs @@ -1,6 +1,5 @@ use std::sync::Arc; -use prometeu_abi::model::Sample; -use prometeu_hardware_contract::AudioBridge; +use prometeu_hal::AudioBridge; /// Maximum number of simultaneous audio voices supported by the hardware. pub const MAX_CHANNELS: usize = 16; @@ -8,7 +7,8 @@ pub const MAX_CHANNELS: usize = 16; pub const OUTPUT_SAMPLE_RATE: u32 = 48000; /// Looping mode for samples (re-exported from the hardware contract). -pub use prometeu_hardware_contract::LoopMode; +pub use prometeu_hal::LoopMode; +use prometeu_hal::sample::Sample; use crate::memory_banks::SoundBankPoolAccess; /// State of a single playback voice (channel). @@ -114,12 +114,12 @@ pub struct Audio { } impl AudioBridge for Audio { - fn play(&mut self, bank_id: u8, sample_id: u16, voice_id: usize, volume: u8, pan: u8, pitch: f64, priority: u8, loop_mode: prometeu_hardware_contract::LoopMode) { - let lm = match loop_mode { prometeu_hardware_contract::LoopMode::Off => LoopMode::Off, prometeu_hardware_contract::LoopMode::On => LoopMode::On }; + fn play(&mut self, bank_id: u8, sample_id: u16, voice_id: usize, volume: u8, pan: u8, pitch: f64, priority: u8, loop_mode: prometeu_hal::LoopMode) { + let lm = match loop_mode { prometeu_hal::LoopMode::Off => LoopMode::Off, prometeu_hal::LoopMode::On => LoopMode::On }; self.play(bank_id, sample_id, voice_id, volume, pan, pitch, priority, lm) } - fn play_sample(&mut self, sample: Arc, voice_id: usize, volume: u8, pan: u8, pitch: f64, priority: u8, loop_mode: prometeu_hardware_contract::LoopMode) { - let lm = match loop_mode { prometeu_hardware_contract::LoopMode::Off => LoopMode::Off, prometeu_hardware_contract::LoopMode::On => LoopMode::On }; + fn play_sample(&mut self, sample: Arc, voice_id: usize, volume: u8, pan: u8, pitch: f64, priority: u8, loop_mode: prometeu_hal::LoopMode) { + let lm = match loop_mode { prometeu_hal::LoopMode::Off => LoopMode::Off, prometeu_hal::LoopMode::On => LoopMode::On }; self.play_sample(sample, voice_id, volume, pan, pitch, priority, lm) } fn stop(&mut self, voice_id: usize) { self.stop(voice_id) } diff --git a/crates/prometeu-hardware/src/gfx.rs b/crates/console/prometeu-drivers/src/gfx.rs similarity index 97% rename from crates/prometeu-hardware/src/gfx.rs rename to crates/console/prometeu-drivers/src/gfx.rs index 65012255..5e36e3de 100644 --- a/crates/prometeu-hardware/src/gfx.rs +++ b/crates/console/prometeu-drivers/src/gfx.rs @@ -1,7 +1,11 @@ use crate::memory_banks::TileBankPoolAccess; -use prometeu_abi::model::{Color, HudTileLayer, ScrollableTileLayer, Sprite, Tile, TileBank, TileMap, TileSize}; use std::sync::Arc; -use prometeu_hardware_contract::GfxBridge; +use prometeu_hal::color::Color; +use prometeu_hal::GfxBridge; +use prometeu_hal::sprite::Sprite; +use prometeu_hal::tile::Tile; +use prometeu_hal::tile_bank::{TileBank, TileSize}; +use prometeu_hal::tile_layer::{HudTileLayer, ScrollableTileLayer, TileMap}; /// Blending modes inspired by classic 16-bit hardware. /// Defines how source pixels are combined with existing pixels in the framebuffer. @@ -78,7 +82,7 @@ impl GfxBridge for Gfx { fn size(&self) -> (usize, usize) { self.size() } fn front_buffer(&self) -> &[u16] { self.front_buffer() } fn clear(&mut self, color: Color) { self.clear(color) } - fn fill_rect_blend(&mut self, x: i32, y: i32, w: i32, h: i32, color: Color, mode: prometeu_hardware_contract::BlendMode) { let m = match mode { prometeu_hardware_contract::BlendMode::None => BlendMode::None, prometeu_hardware_contract::BlendMode::Half => BlendMode::Half, prometeu_hardware_contract::BlendMode::HalfPlus => BlendMode::HalfPlus, prometeu_hardware_contract::BlendMode::HalfMinus => BlendMode::HalfMinus, prometeu_hardware_contract::BlendMode::Full => BlendMode::Full }; self.fill_rect_blend(x, y, w, h, color, m) } + fn fill_rect_blend(&mut self, x: i32, y: i32, w: i32, h: i32, color: Color, mode: prometeu_hal::BlendMode) { let m = match mode { prometeu_hal::BlendMode::None => BlendMode::None, prometeu_hal::BlendMode::Half => BlendMode::Half, prometeu_hal::BlendMode::HalfPlus => BlendMode::HalfPlus, prometeu_hal::BlendMode::HalfMinus => BlendMode::HalfMinus, prometeu_hal::BlendMode::Full => BlendMode::Full }; self.fill_rect_blend(x, y, w, h, color, m) } fn fill_rect(&mut self, x: i32, y: i32, w: i32, h: i32, color: Color) { self.fill_rect(x, y, w, h, color) } fn draw_pixel(&mut self, x: i32, y: i32, color: Color) { self.draw_pixel(x, y, color) } fn draw_line(&mut self, x0: i32, y0: i32, x1: i32, y1: i32, color: Color) { self.draw_line(x0, y0, x1, y1, color) } diff --git a/crates/prometeu-hardware/src/hardware.rs b/crates/console/prometeu-drivers/src/hardware.rs similarity index 96% rename from crates/prometeu-hardware/src/hardware.rs rename to crates/console/prometeu-drivers/src/hardware.rs index 07338da3..fcd92b82 100644 --- a/crates/prometeu-hardware/src/hardware.rs +++ b/crates/console/prometeu-drivers/src/hardware.rs @@ -1,5 +1,5 @@ use std::sync::Arc; -use prometeu_hardware_contract::{AssetBridge, AudioBridge, GfxBridge, HardwareBridge, PadBridge, TouchBridge}; +use prometeu_hal::{AssetBridge, AudioBridge, GfxBridge, HardwareBridge, PadBridge, TouchBridge}; use crate::asset::AssetManager; use crate::audio::Audio; use crate::gfx::Gfx; diff --git a/crates/prometeu-hardware/src/lib.rs b/crates/console/prometeu-drivers/src/lib.rs similarity index 100% rename from crates/prometeu-hardware/src/lib.rs rename to crates/console/prometeu-drivers/src/lib.rs diff --git a/crates/prometeu-hardware/src/memory_banks.rs b/crates/console/prometeu-drivers/src/memory_banks.rs similarity index 97% rename from crates/prometeu-hardware/src/memory_banks.rs rename to crates/console/prometeu-drivers/src/memory_banks.rs index 0d436ec5..61482bb8 100644 --- a/crates/prometeu-hardware/src/memory_banks.rs +++ b/crates/console/prometeu-drivers/src/memory_banks.rs @@ -1,5 +1,6 @@ use std::sync::{Arc, RwLock}; -use prometeu_abi::model::{SoundBank, TileBank}; +use prometeu_hal::sound_bank::SoundBank; +use prometeu_hal::tile_bank::TileBank; /// Non-generic interface for peripherals to access graphical tile banks. pub trait TileBankPoolAccess: Send + Sync { diff --git a/crates/prometeu-hardware/src/pad.rs b/crates/console/prometeu-drivers/src/pad.rs similarity index 95% rename from crates/prometeu-hardware/src/pad.rs rename to crates/console/prometeu-drivers/src/pad.rs index 7521cef6..da1739e0 100644 --- a/crates/prometeu-hardware/src/pad.rs +++ b/crates/console/prometeu-drivers/src/pad.rs @@ -1,5 +1,5 @@ -use prometeu_abi::model::Button; -use prometeu_hardware_contract::{InputSignals, PadBridge}; +use prometeu_hal::{InputSignals, PadBridge}; +use prometeu_hal::button::Button; #[derive(Default, Clone, Copy, Debug)] pub struct Pad { diff --git a/crates/prometeu-hardware/src/touch.rs b/crates/console/prometeu-drivers/src/touch.rs similarity index 86% rename from crates/prometeu-hardware/src/touch.rs rename to crates/console/prometeu-drivers/src/touch.rs index b1a61248..fcdbcc5c 100644 --- a/crates/prometeu-hardware/src/touch.rs +++ b/crates/console/prometeu-drivers/src/touch.rs @@ -1,5 +1,5 @@ -use prometeu_abi::model::{Button}; -use prometeu_hardware_contract::{InputSignals, TouchBridge}; +use prometeu_hal::{InputSignals, TouchBridge}; +use prometeu_hal::button::Button; #[derive(Default, Clone, Copy, Debug)] pub struct Touch { diff --git a/crates/console/prometeu-drivers/tests/heartbeat.rs b/crates/console/prometeu-drivers/tests/heartbeat.rs new file mode 100644 index 00000000..a3e3f8b2 --- /dev/null +++ b/crates/console/prometeu-drivers/tests/heartbeat.rs @@ -0,0 +1,74 @@ +// use std::fs; +// use std::path::Path; +// use prometeu_abi::{Value, VmFault}; +// use prometeu_drivers::hardware::Hardware; +// use prometeu_hal::{HostContext, HostReturn, NativeInterface}; +// use prometeu_vm::{LogicalFrameEndingReason, VirtualMachine}; +// +// struct MockNative; +// impl NativeInterface for MockNative { +// fn syscall(&mut self, id: u32, _args: &[Value], ret: &mut HostReturn, _ctx: &mut HostContext) -> Result<(), VmFault> { +// if id == 0x2010 { // InputPadSnapshot +// for _ in 0..48 { +// ret.push_bool(false); +// } +// } else if id == 0x2011 { // InputTouchSnapshot +// for _ in 0..6 { +// ret.push_int(0); +// } +// } else { +// // Push one result for others that might expect it +// // Based on results_count() in syscalls.rs, most return 1 except GfxClear565 (0) +// if id != 0x1010 { +// ret.push_null(); +// } +// } +// Ok(()) +// } +// } +// +// #[test] +// fn test_canonical_cartridge_heartbeat() { +// let mut pbc_path = Path::new("../../test-cartridges/canonical/golden/program.pbc").to_path_buf(); +// if !pbc_path.exists() { +// pbc_path = Path::new("test-cartridges/canonical/golden/program.pbc").to_path_buf(); +// } +// +// let pbc_bytes = fs::read(pbc_path).expect("Failed to read canonical PBC. Did you run the generation test?"); +// +// // Determine entrypoint from the compiled module exports +// let entry_symbol = "src/main/modules:frame"; +// +// let mut vm = VirtualMachine::new(vec![], vec![]); +// vm.initialize(pbc_bytes, entry_symbol).expect("Failed to initialize VM with canonical cartridge"); +// vm.prepare_call(entry_symbol); +// +// let mut native = MockNative; +// let mut hw = Hardware::new(); +// let mut ctx = HostContext::new(Some(&mut hw)); +// +// // Run for a reasonable budget +// let report = vm.run_budget(1000, &mut native, &mut ctx).expect("VM failed to run"); +// +// // Acceptance criteria: +// // 1. No traps +// match report.reason { +// LogicalFrameEndingReason::Trap(trap) => panic!("VM trapped: {:?}", trap), +// LogicalFrameEndingReason::Panic(msg) => panic!("VM panicked: {}", msg), +// LogicalFrameEndingReason::Halted => {}, +// LogicalFrameEndingReason::EndOfRom => {}, +// LogicalFrameEndingReason::FrameSync => {}, +// LogicalFrameEndingReason::BudgetExhausted => {}, +// LogicalFrameEndingReason::Breakpoint => {}, +// } +// +// // 2. Deterministic output state (if any) +// // Observação: a PVM agora sinaliza FRAME_SYNC imediatamente antes do RET do entry point. +// // Quando o motivo é FRAME_SYNC, não exigimos pilha vazia (a limpeza final ocorre após o RET). +// // Para os demais motivos (RET/Halted/EndOfRom), a pilha deve estar vazia para frame(): void. +// if !matches!(report.reason, LogicalFrameEndingReason::FrameSync) { +// assert_eq!(vm.operand_stack.len(), 0, "Stack should be empty after frame() execution"); +// } +// +// println!("Heartbeat test passed!"); +// } diff --git a/crates/console/prometeu-firmware/Cargo.toml b/crates/console/prometeu-firmware/Cargo.toml new file mode 100644 index 00000000..50e569d9 --- /dev/null +++ b/crates/console/prometeu-firmware/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "prometeu-firmware" +version = "0.1.0" +edition = "2024" +license.workspace = true + +[dependencies] +prometeu-drivers = { path = "../prometeu-drivers" } +prometeu-vm = { path = "../prometeu-vm" } +prometeu-system = { path = "../prometeu-system" } +prometeu-bytecode = { path = "../../compiler/prometeu-bytecode" } +prometeu-abi = { path = "../../compiler/prometeu-abi" } +prometeu-hal = { path = "../prometeu-hal" } +serde = { version = "1.0.228", features = ["derive"] } +serde_json = "1.0.149" diff --git a/crates/prometeu-firmware/src/firmware/boot_target.rs b/crates/console/prometeu-firmware/src/firmware/boot_target.rs similarity index 100% rename from crates/prometeu-firmware/src/firmware/boot_target.rs rename to crates/console/prometeu-firmware/src/firmware/boot_target.rs diff --git a/crates/prometeu-firmware/src/firmware/firmware.rs b/crates/console/prometeu-firmware/src/firmware/firmware.rs similarity index 95% rename from crates/prometeu-firmware/src/firmware/firmware.rs rename to crates/console/prometeu-firmware/src/firmware/firmware.rs index fadf78ab..2c8bfd29 100644 --- a/crates/prometeu-firmware/src/firmware/firmware.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware.rs @@ -1,12 +1,11 @@ -use prometeu_abi::model::Cartridge; -use prometeu_abi::telemetry::CertificationConfig; -use prometeu_hardware_contract::{HardwareBridge, InputSignals}; -use prometeu_kernel::PrometeuOS; +use prometeu_hal::telemetry::CertificationConfig; +use prometeu_hal::{HardwareBridge, InputSignals}; +use prometeu_hal::cartridge::Cartridge; +use prometeu_system::{PrometeuHub, VirtualMachineRuntime}; use prometeu_vm::VirtualMachine; use crate::firmware::boot_target::BootTarget; use crate::firmware::firmware_state::{FirmwareState, LoadCartridgeStep, ResetStep}; use crate::firmware::prometeu_context::PrometeuContext; -use crate::prometeu_hub::PrometeuHub; /// PROMETEU Firmware. /// @@ -27,7 +26,7 @@ pub struct Firmware { /// The execution engine (PVM) for user applications. pub vm: VirtualMachine, /// The underlying OS services (Syscalls, Filesystem, Telemetry). - pub os: PrometeuOS, + pub os: VirtualMachineRuntime, /// The internal state of the system launcher (Hub). pub hub: PrometeuHub, /// The current operational state (e.g., Reset, SplashScreen, GameRunning). @@ -43,7 +42,7 @@ impl Firmware { pub fn new(cap_config: Option) -> Self { Self { vm: VirtualMachine::default(), - os: PrometeuOS::new(cap_config), + os: VirtualMachineRuntime::new(cap_config), hub: PrometeuHub::new(), state: FirmwareState::Reset(ResetStep), boot_target: BootTarget::Hub, diff --git a/crates/prometeu-firmware/src/firmware/firmware_state.rs b/crates/console/prometeu-firmware/src/firmware/firmware_state.rs similarity index 100% rename from crates/prometeu-firmware/src/firmware/firmware_state.rs rename to crates/console/prometeu-firmware/src/firmware/firmware_state.rs diff --git a/crates/prometeu-firmware/src/firmware/firmware_step_crash_screen.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_crash_screen.rs similarity index 93% rename from crates/prometeu-firmware/src/firmware/firmware_step_crash_screen.rs rename to crates/console/prometeu-firmware/src/firmware/firmware_step_crash_screen.rs index b2832887..03993014 100644 --- a/crates/prometeu-firmware/src/firmware/firmware_step_crash_screen.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_crash_screen.rs @@ -1,5 +1,5 @@ -use prometeu_abi::log::{LogLevel, LogSource}; -use prometeu_abi::model::Color; +use prometeu_hal::log::{LogLevel, LogSource}; +use prometeu_hal::color::Color; use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep}; use crate::firmware::prometeu_context::PrometeuContext; diff --git a/crates/prometeu-firmware/src/firmware/firmware_step_game_running.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_game_running.rs similarity index 94% rename from crates/prometeu-firmware/src/firmware/firmware_step_game_running.rs rename to crates/console/prometeu-firmware/src/firmware/firmware_step_game_running.rs index a8017936..d2202b04 100644 --- a/crates/prometeu-firmware/src/firmware/firmware_step_game_running.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_game_running.rs @@ -1,4 +1,4 @@ -use prometeu_abi::log::{LogLevel, LogSource}; +use prometeu_hal::log::{LogLevel, LogSource}; use crate::firmware::firmware_state::{AppCrashesStep, FirmwareState}; use crate::firmware::prometeu_context::PrometeuContext; diff --git a/crates/prometeu-firmware/src/firmware/firmware_step_hub_home.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_hub_home.rs similarity index 96% rename from crates/prometeu-firmware/src/firmware/firmware_step_hub_home.rs rename to crates/console/prometeu-firmware/src/firmware/firmware_step_hub_home.rs index 9388820f..5eb94ed6 100644 --- a/crates/prometeu-firmware/src/firmware/firmware_step_hub_home.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_hub_home.rs @@ -1,6 +1,6 @@ use crate::firmware::firmware_state::{AppCrashesStep, FirmwareState}; use crate::firmware::prometeu_context::PrometeuContext; -use prometeu_abi::log::{LogLevel, LogSource}; +use prometeu_hal::log::{LogLevel, LogSource}; #[derive(Debug, Clone)] pub struct HubHomeStep; diff --git a/crates/prometeu-firmware/src/firmware/firmware_step_launch_hub.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_launch_hub.rs similarity index 92% rename from crates/prometeu-firmware/src/firmware/firmware_step_launch_hub.rs rename to crates/console/prometeu-firmware/src/firmware/firmware_step_launch_hub.rs index 1989caa9..a110799b 100644 --- a/crates/prometeu-firmware/src/firmware/firmware_step_launch_hub.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_launch_hub.rs @@ -1,8 +1,8 @@ use crate::firmware::boot_target::BootTarget; use crate::firmware::firmware_state::{FirmwareState, HubHomeStep, LoadCartridgeStep}; use crate::firmware::prometeu_context::PrometeuContext; -use prometeu_abi::log::{LogLevel, LogSource}; -use prometeu_abi::model::CartridgeLoader; +use prometeu_hal::log::{LogLevel, LogSource}; +use prometeu_hal::cartridge_loader::CartridgeLoader; #[derive(Debug, Clone)] pub struct LaunchHubStep; diff --git a/crates/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs similarity index 90% rename from crates/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs rename to crates/console/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs index e383d3fa..c0122f11 100644 --- a/crates/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_load_cartridge.rs @@ -1,7 +1,9 @@ use crate::firmware::firmware_state::{FirmwareState, GameRunningStep, HubHomeStep}; use crate::firmware::prometeu_context::PrometeuContext; -use prometeu_abi::log::{LogLevel, LogSource}; -use prometeu_abi::model::{AppMode, Cartridge, Color, Rect}; +use prometeu_hal::log::{LogLevel, LogSource}; +use prometeu_hal::cartridge::{AppMode, Cartridge}; +use prometeu_hal::color::Color; +use prometeu_hal::window::Rect; #[derive(Debug, Clone)] pub struct LoadCartridgeStep { diff --git a/crates/prometeu-firmware/src/firmware/firmware_step_reset.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_reset.rs similarity index 94% rename from crates/prometeu-firmware/src/firmware/firmware_step_reset.rs rename to crates/console/prometeu-firmware/src/firmware/firmware_step_reset.rs index e727057d..990ade0e 100644 --- a/crates/prometeu-firmware/src/firmware/firmware_step_reset.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_reset.rs @@ -1,4 +1,4 @@ -use prometeu_abi::log::{LogLevel, LogSource}; +use prometeu_hal::log::{LogLevel, LogSource}; use crate::firmware::boot_target::BootTarget; use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep, SplashScreenStep}; use crate::firmware::prometeu_context::PrometeuContext; diff --git a/crates/prometeu-firmware/src/firmware/firmware_step_splash_screen.rs b/crates/console/prometeu-firmware/src/firmware/firmware_step_splash_screen.rs similarity index 96% rename from crates/prometeu-firmware/src/firmware/firmware_step_splash_screen.rs rename to crates/console/prometeu-firmware/src/firmware/firmware_step_splash_screen.rs index 45c9b5ff..88c923c9 100644 --- a/crates/prometeu-firmware/src/firmware/firmware_step_splash_screen.rs +++ b/crates/console/prometeu-firmware/src/firmware/firmware_step_splash_screen.rs @@ -1,7 +1,7 @@ use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep}; use crate::firmware::prometeu_context::PrometeuContext; -use prometeu_abi::log::{LogLevel, LogSource}; -use prometeu_abi::model::Color; +use prometeu_hal::log::{LogLevel, LogSource}; +use prometeu_hal::color::Color; #[derive(Debug, Clone)] pub struct SplashScreenStep { diff --git a/crates/prometeu-firmware/src/firmware/mod.rs b/crates/console/prometeu-firmware/src/firmware/mod.rs similarity index 100% rename from crates/prometeu-firmware/src/firmware/mod.rs rename to crates/console/prometeu-firmware/src/firmware/mod.rs diff --git a/crates/prometeu-firmware/src/firmware/prometeu_context.rs b/crates/console/prometeu-firmware/src/firmware/prometeu_context.rs similarity index 63% rename from crates/prometeu-firmware/src/firmware/prometeu_context.rs rename to crates/console/prometeu-firmware/src/firmware/prometeu_context.rs index f392fa6d..3095cd37 100644 --- a/crates/prometeu-firmware/src/firmware/prometeu_context.rs +++ b/crates/console/prometeu-firmware/src/firmware/prometeu_context.rs @@ -1,12 +1,11 @@ -use prometeu_hardware_contract::{HardwareBridge, InputSignals}; -use prometeu_kernel::PrometeuOS; +use prometeu_hal::{HardwareBridge, InputSignals}; +use prometeu_system::{PrometeuHub, VirtualMachineRuntime}; use prometeu_vm::VirtualMachine; use crate::firmware::boot_target::BootTarget; -use crate::prometeu_hub::PrometeuHub; pub struct PrometeuContext<'a> { pub vm: &'a mut VirtualMachine, - pub os: &'a mut PrometeuOS, + pub os: &'a mut VirtualMachineRuntime, pub hub: &'a mut PrometeuHub, pub boot_target: &'a BootTarget, pub signals: &'a InputSignals, diff --git a/crates/console/prometeu-firmware/src/lib.rs b/crates/console/prometeu-firmware/src/lib.rs new file mode 100644 index 00000000..d680179f --- /dev/null +++ b/crates/console/prometeu-firmware/src/lib.rs @@ -0,0 +1,3 @@ +pub mod firmware; + +pub use firmware::*; diff --git a/crates/prometeu-hardware-contract/Cargo.toml b/crates/console/prometeu-hal/Cargo.toml similarity index 53% rename from crates/prometeu-hardware-contract/Cargo.toml rename to crates/console/prometeu-hal/Cargo.toml index 2c5f8354..b6726385 100644 --- a/crates/prometeu-hardware-contract/Cargo.toml +++ b/crates/console/prometeu-hal/Cargo.toml @@ -1,11 +1,11 @@ [package] -name = "prometeu-hardware-contract" +name = "prometeu-hal" version = "0.1.0" edition = "2024" license.workspace = true [dependencies] -prometeu-abi = { path = "../prometeu-abi" } -prometeu-bytecode = { path = "../prometeu-bytecode" } +prometeu-abi = { path = "../../compiler/prometeu-abi" } +prometeu-bytecode = { path = "../../compiler/prometeu-bytecode" } serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" \ No newline at end of file diff --git a/crates/prometeu-abi/src/model/asset.rs b/crates/console/prometeu-hal/src/asset.rs similarity index 100% rename from crates/prometeu-abi/src/model/asset.rs rename to crates/console/prometeu-hal/src/asset.rs diff --git a/crates/prometeu-hardware-contract/src/asset_bridge.rs b/crates/console/prometeu-hal/src/asset_bridge.rs similarity index 83% rename from crates/prometeu-hardware-contract/src/asset_bridge.rs rename to crates/console/prometeu-hal/src/asset_bridge.rs index 623e3ce5..98bf6d83 100644 --- a/crates/prometeu-hardware-contract/src/asset_bridge.rs +++ b/crates/console/prometeu-hal/src/asset_bridge.rs @@ -1,6 +1,4 @@ -use prometeu_abi::model::{ - AssetEntry, BankStats, BankType, HandleId, LoadStatus, PreloadEntry, SlotRef, SlotStats, -}; +use crate::asset::{AssetEntry, BankStats, BankType, HandleId, LoadStatus, PreloadEntry, SlotRef, SlotStats}; pub trait AssetBridge { fn initialize_for_cartridge( diff --git a/crates/prometeu-hardware-contract/src/audio_bridge.rs b/crates/console/prometeu-hal/src/audio_bridge.rs similarity index 96% rename from crates/prometeu-hardware-contract/src/audio_bridge.rs rename to crates/console/prometeu-hal/src/audio_bridge.rs index 0e1df473..e8c0856a 100644 --- a/crates/prometeu-hardware-contract/src/audio_bridge.rs +++ b/crates/console/prometeu-hal/src/audio_bridge.rs @@ -1,5 +1,5 @@ -use prometeu_abi::model::Sample; use std::sync::Arc; +use crate::sample::Sample; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum LoopMode { diff --git a/crates/prometeu-abi/src/model/button.rs b/crates/console/prometeu-hal/src/button.rs similarity index 100% rename from crates/prometeu-abi/src/model/button.rs rename to crates/console/prometeu-hal/src/button.rs diff --git a/crates/prometeu-abi/src/model/cartridge.rs b/crates/console/prometeu-hal/src/cartridge.rs similarity index 97% rename from crates/prometeu-abi/src/model/cartridge.rs rename to crates/console/prometeu-hal/src/cartridge.rs index 6beadebc..fd3b4ae7 100644 --- a/crates/prometeu-abi/src/model/cartridge.rs +++ b/crates/console/prometeu-hal/src/cartridge.rs @@ -1,4 +1,4 @@ -use crate::model::asset::{AssetEntry, PreloadEntry}; +use crate::asset::{AssetEntry, PreloadEntry}; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)] diff --git a/crates/prometeu-abi/src/model/cartridge_loader.rs b/crates/console/prometeu-hal/src/cartridge_loader.rs similarity index 96% rename from crates/prometeu-abi/src/model/cartridge_loader.rs rename to crates/console/prometeu-hal/src/cartridge_loader.rs index 960e5f8c..459751c8 100644 --- a/crates/prometeu-abi/src/model/cartridge_loader.rs +++ b/crates/console/prometeu-hal/src/cartridge_loader.rs @@ -1,6 +1,6 @@ -use crate::model::cartridge::{Cartridge, CartridgeDTO, CartridgeError, CartridgeManifest}; use std::fs; use std::path::Path; +use crate::cartridge::{Cartridge, CartridgeDTO, CartridgeError, CartridgeManifest}; pub struct CartridgeLoader; diff --git a/crates/prometeu-abi/src/model/color.rs b/crates/console/prometeu-hal/src/color.rs similarity index 100% rename from crates/prometeu-abi/src/model/color.rs rename to crates/console/prometeu-hal/src/color.rs diff --git a/crates/prometeu-abi/src/debugger_protocol.rs b/crates/console/prometeu-hal/src/debugger_protocol.rs similarity index 97% rename from crates/prometeu-abi/src/debugger_protocol.rs rename to crates/console/prometeu-hal/src/debugger_protocol.rs index 31bfbd58..df80c143 100644 --- a/crates/prometeu-abi/src/debugger_protocol.rs +++ b/crates/console/prometeu-hal/src/debugger_protocol.rs @@ -1,7 +1,6 @@ -use crate::model::AppMode; use serde::{Deserialize, Serialize}; - -use crate::virtual_machine::Value; +use prometeu_abi::Value; +use crate::cartridge::AppMode; pub const DEVTOOLS_PROTOCOL_VERSION: u32 = 1; @@ -102,7 +101,6 @@ pub enum DebugEvent { #[cfg(test)] mod tests { use super::*; - use crate::virtual_machine::Value; #[test] fn test_telemetry_event_serialization() { diff --git a/crates/prometeu-hardware-contract/src/gfx_bridge.rs b/crates/console/prometeu-hal/src/gfx_bridge.rs similarity index 95% rename from crates/prometeu-hardware-contract/src/gfx_bridge.rs rename to crates/console/prometeu-hal/src/gfx_bridge.rs index a10b5a84..ef6e3d59 100644 --- a/crates/prometeu-hardware-contract/src/gfx_bridge.rs +++ b/crates/console/prometeu-hal/src/gfx_bridge.rs @@ -1,4 +1,6 @@ -use prometeu_abi::model::{Color, HudTileLayer, ScrollableTileLayer, Sprite}; +use crate::color::Color; +use crate::sprite::Sprite; +use crate::tile_layer::{HudTileLayer, ScrollableTileLayer}; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum BlendMode { diff --git a/crates/prometeu-hardware-contract/src/hardware_bridge.rs b/crates/console/prometeu-hal/src/hardware_bridge.rs similarity index 100% rename from crates/prometeu-hardware-contract/src/hardware_bridge.rs rename to crates/console/prometeu-hal/src/hardware_bridge.rs diff --git a/crates/prometeu-hardware-contract/src/host_context.rs b/crates/console/prometeu-hal/src/host_context.rs similarity index 92% rename from crates/prometeu-hardware-contract/src/host_context.rs rename to crates/console/prometeu-hal/src/host_context.rs index a7e6c73a..22c9ae53 100644 --- a/crates/prometeu-hardware-contract/src/host_context.rs +++ b/crates/console/prometeu-hal/src/host_context.rs @@ -1,5 +1,5 @@ +use prometeu_abi::VmFault; use crate::hardware_bridge::HardwareBridge; -use prometeu_abi::virtual_machine::VmFault; pub struct HostContext<'a> { pub hw: Option<&'a mut dyn HardwareBridge>, diff --git a/crates/prometeu-hardware-contract/src/host_return.rs b/crates/console/prometeu-hal/src/host_return.rs similarity index 72% rename from crates/prometeu-hardware-contract/src/host_return.rs rename to crates/console/prometeu-hal/src/host_return.rs index fa2b5161..780bd8be 100644 --- a/crates/prometeu-hardware-contract/src/host_return.rs +++ b/crates/console/prometeu-hal/src/host_return.rs @@ -1,4 +1,5 @@ -use prometeu_abi::virtual_machine::Value; +use prometeu_abi::Value; +use prometeu_abi::VmFault; pub struct HostReturn<'a> { stack: &'a mut Vec @@ -14,9 +15,9 @@ impl<'a> HostReturn<'a> { pub fn push_int(&mut self, v: i64) { self.stack.push(Value::Int64(v)); } - pub fn push_bounded(&mut self, v: u32) -> Result<(), prometeu_abi::virtual_machine::VmFault> { + pub fn push_bounded(&mut self, v: u32) -> Result<(), VmFault> { if v > 0xFFFF { - return Err(prometeu_abi::virtual_machine::VmFault::Trap(prometeu_bytecode::abi::TRAP_OOB, "Bounded value overflow".into())); + return Err(VmFault::Trap(prometeu_bytecode::abi::TRAP_OOB, "Bounded value overflow".into())); } self.stack.push(Value::Bounded(v)); Ok(()) diff --git a/crates/prometeu-hardware-contract/src/input_signals.rs b/crates/console/prometeu-hal/src/input_signals.rs similarity index 100% rename from crates/prometeu-hardware-contract/src/input_signals.rs rename to crates/console/prometeu-hal/src/input_signals.rs diff --git a/crates/prometeu-hardware-contract/src/lib.rs b/crates/console/prometeu-hal/src/lib.rs similarity index 71% rename from crates/prometeu-hardware-contract/src/lib.rs rename to crates/console/prometeu-hal/src/lib.rs index 2e677269..f36f3780 100644 --- a/crates/prometeu-hardware-contract/src/lib.rs +++ b/crates/console/prometeu-hal/src/lib.rs @@ -9,6 +9,22 @@ pub mod pad_bridge; pub mod touch_bridge; pub mod native_helpers; pub mod input_signals; +pub mod cartridge; +pub mod cartridge_loader; +pub mod debugger_protocol; +pub mod asset; +pub mod color; +pub mod button; +pub mod tile; +pub mod tile_layer; +pub mod tile_bank; +pub mod sound_bank; +pub mod sprite; +pub mod sample; +pub mod window; +pub mod syscalls; +pub mod telemetry; +pub mod log; pub use asset_bridge::AssetBridge; pub use audio_bridge::{AudioBridge, LoopMode}; diff --git a/crates/prometeu-abi/src/log/log_event.rs b/crates/console/prometeu-hal/src/log/log_event.rs similarity index 78% rename from crates/prometeu-abi/src/log/log_event.rs rename to crates/console/prometeu-hal/src/log/log_event.rs index a35382b9..b5d5ef9b 100644 --- a/crates/prometeu-abi/src/log/log_event.rs +++ b/crates/console/prometeu-hal/src/log/log_event.rs @@ -1,5 +1,4 @@ -use crate::log::LogLevel; -use crate::log::LogSource; +use crate::log::{LogLevel, LogSource}; #[derive(Debug, Clone)] pub struct LogEvent { diff --git a/crates/prometeu-abi/src/log/log_level.rs b/crates/console/prometeu-hal/src/log/log_level.rs similarity index 100% rename from crates/prometeu-abi/src/log/log_level.rs rename to crates/console/prometeu-hal/src/log/log_level.rs diff --git a/crates/prometeu-abi/src/log/log_service.rs b/crates/console/prometeu-hal/src/log/log_service.rs similarity index 100% rename from crates/prometeu-abi/src/log/log_service.rs rename to crates/console/prometeu-hal/src/log/log_service.rs index a1b607e4..d3065683 100644 --- a/crates/prometeu-abi/src/log/log_service.rs +++ b/crates/console/prometeu-hal/src/log/log_service.rs @@ -1,5 +1,5 @@ -use crate::log::{LogEvent, LogLevel, LogSource}; use std::collections::VecDeque; +use crate::log::{LogEvent, LogLevel, LogSource}; pub struct LogService { events: VecDeque, diff --git a/crates/prometeu-abi/src/log/log_source.rs b/crates/console/prometeu-hal/src/log/log_source.rs similarity index 100% rename from crates/prometeu-abi/src/log/log_source.rs rename to crates/console/prometeu-hal/src/log/log_source.rs diff --git a/crates/prometeu-abi/src/log/mod.rs b/crates/console/prometeu-hal/src/log/mod.rs similarity index 100% rename from crates/prometeu-abi/src/log/mod.rs rename to crates/console/prometeu-hal/src/log/mod.rs diff --git a/crates/prometeu-hardware-contract/src/native_helpers.rs b/crates/console/prometeu-hal/src/native_helpers.rs similarity index 94% rename from crates/prometeu-hardware-contract/src/native_helpers.rs rename to crates/console/prometeu-hal/src/native_helpers.rs index 97c3ee2f..bef54d8e 100644 --- a/crates/prometeu-hardware-contract/src/native_helpers.rs +++ b/crates/console/prometeu-hal/src/native_helpers.rs @@ -1,4 +1,5 @@ -use prometeu_abi::virtual_machine::{Value, VmFault}; +use prometeu_abi::Value; +use prometeu_abi::VmFault; pub fn expect_bounded(args: &[Value], idx: usize) -> Result { args.get(idx) diff --git a/crates/prometeu-hardware-contract/src/native_interface.rs b/crates/console/prometeu-hal/src/native_interface.rs similarity index 89% rename from crates/prometeu-hardware-contract/src/native_interface.rs rename to crates/console/prometeu-hal/src/native_interface.rs index cb382fd2..fa93be91 100644 --- a/crates/prometeu-hardware-contract/src/native_interface.rs +++ b/crates/console/prometeu-hal/src/native_interface.rs @@ -1,4 +1,4 @@ -use prometeu_abi::virtual_machine::{Value, VmFault}; +use prometeu_abi::{Value, VmFault}; use crate::host_context::HostContext; use crate::host_return::HostReturn; diff --git a/crates/prometeu-hardware-contract/src/pad_bridge.rs b/crates/console/prometeu-hal/src/pad_bridge.rs similarity index 93% rename from crates/prometeu-hardware-contract/src/pad_bridge.rs rename to crates/console/prometeu-hal/src/pad_bridge.rs index 57bf1e7d..b0b1fcc3 100644 --- a/crates/prometeu-hardware-contract/src/pad_bridge.rs +++ b/crates/console/prometeu-hal/src/pad_bridge.rs @@ -1,5 +1,5 @@ +use crate::button::Button; use crate::input_signals::InputSignals; -use prometeu_abi::model::Button; pub trait PadBridge { fn begin_frame(&mut self, signals: &InputSignals); diff --git a/crates/prometeu-abi/src/model/sample.rs b/crates/console/prometeu-hal/src/sample.rs similarity index 100% rename from crates/prometeu-abi/src/model/sample.rs rename to crates/console/prometeu-hal/src/sample.rs diff --git a/crates/prometeu-abi/src/model/sound_bank.rs b/crates/console/prometeu-hal/src/sound_bank.rs similarity index 92% rename from crates/prometeu-abi/src/model/sound_bank.rs rename to crates/console/prometeu-hal/src/sound_bank.rs index fbf70218..97edfb3b 100644 --- a/crates/prometeu-abi/src/model/sound_bank.rs +++ b/crates/console/prometeu-hal/src/sound_bank.rs @@ -1,5 +1,5 @@ -use crate::model::Sample; use std::sync::Arc; +use crate::sample::Sample; /// A container for audio assets. /// diff --git a/crates/prometeu-abi/src/model/sprite.rs b/crates/console/prometeu-hal/src/sprite.rs similarity index 90% rename from crates/prometeu-abi/src/model/sprite.rs rename to crates/console/prometeu-hal/src/sprite.rs index 39331ab6..ba56e23b 100644 --- a/crates/prometeu-abi/src/model/sprite.rs +++ b/crates/console/prometeu-hal/src/sprite.rs @@ -1,4 +1,4 @@ -use crate::model::Tile; +use crate::tile::Tile; #[derive(Clone, Copy, Debug, Default)] pub struct Sprite { diff --git a/crates/prometeu-abi/src/syscalls.rs b/crates/console/prometeu-hal/src/syscalls.rs similarity index 100% rename from crates/prometeu-abi/src/syscalls.rs rename to crates/console/prometeu-hal/src/syscalls.rs diff --git a/crates/prometeu-abi/src/telemetry.rs b/crates/console/prometeu-hal/src/telemetry.rs similarity index 100% rename from crates/prometeu-abi/src/telemetry.rs rename to crates/console/prometeu-hal/src/telemetry.rs diff --git a/crates/prometeu-abi/src/model/tile.rs b/crates/console/prometeu-hal/src/tile.rs similarity index 100% rename from crates/prometeu-abi/src/model/tile.rs rename to crates/console/prometeu-hal/src/tile.rs diff --git a/crates/prometeu-abi/src/model/tile_bank.rs b/crates/console/prometeu-hal/src/tile_bank.rs similarity index 99% rename from crates/prometeu-abi/src/model/tile_bank.rs rename to crates/console/prometeu-hal/src/tile_bank.rs index c7c8f380..185b52f3 100644 --- a/crates/prometeu-abi/src/model/tile_bank.rs +++ b/crates/console/prometeu-hal/src/tile_bank.rs @@ -1,4 +1,4 @@ -use crate::model::Color; +use crate::color::Color; /// Standard sizes for square tiles. #[derive(Clone, Copy, Debug, PartialEq)] diff --git a/crates/prometeu-abi/src/model/tile_layer.rs b/crates/console/prometeu-hal/src/tile_layer.rs similarity index 95% rename from crates/prometeu-abi/src/model/tile_layer.rs rename to crates/console/prometeu-hal/src/tile_layer.rs index cbf975f5..629add9c 100644 --- a/crates/prometeu-abi/src/model/tile_layer.rs +++ b/crates/console/prometeu-hal/src/tile_layer.rs @@ -1,6 +1,6 @@ -use crate::model::tile_bank::TileSize; -use crate::model::Tile; -use crate::model::TileSize::Size8; +use crate::tile::Tile; +use crate::tile_bank::TileSize; +use crate::tile_bank::TileSize::Size8; pub struct TileMap { pub width: usize, diff --git a/crates/prometeu-hardware-contract/src/touch_bridge.rs b/crates/console/prometeu-hal/src/touch_bridge.rs similarity index 85% rename from crates/prometeu-hardware-contract/src/touch_bridge.rs rename to crates/console/prometeu-hal/src/touch_bridge.rs index e84fb8d8..1d83ccde 100644 --- a/crates/prometeu-hardware-contract/src/touch_bridge.rs +++ b/crates/console/prometeu-hal/src/touch_bridge.rs @@ -1,5 +1,5 @@ use crate::input_signals::InputSignals; -use prometeu_abi::model::Button; +use crate::button::Button; pub trait TouchBridge { fn begin_frame(&mut self, signals: &InputSignals); diff --git a/crates/prometeu-abi/src/model/window.rs b/crates/console/prometeu-hal/src/window.rs similarity index 93% rename from crates/prometeu-abi/src/model/window.rs rename to crates/console/prometeu-hal/src/window.rs index 8b4123c2..a699b505 100644 --- a/crates/prometeu-abi/src/model/window.rs +++ b/crates/console/prometeu-hal/src/window.rs @@ -1,4 +1,4 @@ -use crate::model::Color; +use crate::color::Color; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Rect { diff --git a/crates/console/prometeu-system/Cargo.toml b/crates/console/prometeu-system/Cargo.toml new file mode 100644 index 00000000..0c8bacac --- /dev/null +++ b/crates/console/prometeu-system/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "prometeu-system" +version = "0.1.0" +edition = "2024" +license.workspace = true + +[dependencies] +serde_json = "1.0.149" +prometeu-vm = { path = "../prometeu-vm" } +prometeu-bytecode = { path = "../../compiler/prometeu-bytecode" } +prometeu-abi = { path = "../../compiler/prometeu-abi" } +prometeu-hal = { path = "../prometeu-hal" } + +[dev-dependencies] +prometeu-drivers = { path = "../prometeu-drivers" } diff --git a/crates/console/prometeu-system/src/lib.rs b/crates/console/prometeu-system/src/lib.rs new file mode 100644 index 00000000..77857879 --- /dev/null +++ b/crates/console/prometeu-system/src/lib.rs @@ -0,0 +1,7 @@ +mod virtual_machine_runtime; +mod services; +mod programs; + +pub use programs::PrometeuHub; +pub use services::fs; +pub use virtual_machine_runtime::VirtualMachineRuntime; diff --git a/crates/console/prometeu-system/src/programs/mod.rs b/crates/console/prometeu-system/src/programs/mod.rs new file mode 100644 index 00000000..97e3702e --- /dev/null +++ b/crates/console/prometeu-system/src/programs/mod.rs @@ -0,0 +1,3 @@ +mod prometeu_hub; + +pub use prometeu_hub::PrometeuHub; \ No newline at end of file diff --git a/crates/prometeu-firmware/src/prometeu_hub/mod.rs b/crates/console/prometeu-system/src/programs/prometeu_hub/mod.rs similarity index 100% rename from crates/prometeu-firmware/src/prometeu_hub/mod.rs rename to crates/console/prometeu-system/src/programs/prometeu_hub/mod.rs diff --git a/crates/prometeu-firmware/src/prometeu_hub/prometeu_hub.rs b/crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs similarity index 81% rename from crates/prometeu-firmware/src/prometeu_hub/prometeu_hub.rs rename to crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs index 9ea5ffcd..c2634b0c 100644 --- a/crates/prometeu-firmware/src/prometeu_hub/prometeu_hub.rs +++ b/crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs @@ -1,8 +1,9 @@ -use prometeu_abi::log::{LogLevel, LogSource}; -use prometeu_abi::model::{Color, Rect}; -use prometeu_hardware_contract::HardwareBridge; -use prometeu_kernel::PrometeuOS; -use crate::prometeu_hub::window_manager::WindowManager; +use crate::programs::prometeu_hub::window_manager::WindowManager; +use prometeu_hal::log::{LogLevel, LogSource}; +use prometeu_hal::color::Color; +use prometeu_hal::HardwareBridge; +use prometeu_hal::window::Rect; +use crate::VirtualMachineRuntime; /// PrometeuHub: Launcher and system UI environment. pub struct PrometeuHub { @@ -20,7 +21,7 @@ impl PrometeuHub { // Initializes the Window System and lists apps } - pub fn gui_update(&mut self, os: &mut PrometeuOS, hw: &mut dyn HardwareBridge) { + pub fn gui_update(&mut self, os: &mut VirtualMachineRuntime, hw: &mut dyn HardwareBridge) { hw.gfx_mut().clear(Color::BLACK); let mut next_window = None; @@ -46,7 +47,7 @@ impl PrometeuHub { } } - pub fn render(&mut self, _os: &mut PrometeuOS, hw: &mut dyn HardwareBridge) { + pub fn render(&mut self, _os: &mut VirtualMachineRuntime, hw: &mut dyn HardwareBridge) { for window in &self.window_manager.windows { hw.gfx_mut().fill_rect( window.viewport.x, diff --git a/crates/prometeu-firmware/src/prometeu_hub/window_manager.rs b/crates/console/prometeu-system/src/programs/prometeu_hub/window_manager.rs similarity index 96% rename from crates/prometeu-firmware/src/prometeu_hub/window_manager.rs rename to crates/console/prometeu-system/src/programs/prometeu_hub/window_manager.rs index a6b6b1aa..7748e002 100644 --- a/crates/prometeu-firmware/src/prometeu_hub/window_manager.rs +++ b/crates/console/prometeu-system/src/programs/prometeu_hub/window_manager.rs @@ -1,4 +1,5 @@ -use prometeu_abi::model::{Color, Rect, Window, WindowId}; +use prometeu_hal::color::Color; +use prometeu_hal::window::{Rect, Window, WindowId}; /// PROMETEU Window Manager. pub struct WindowManager { @@ -50,7 +51,6 @@ impl WindowManager { #[cfg(test)] mod tests { use super::*; - use prometeu_abi::model::Rect; #[test] fn test_window_manager_focus() { diff --git a/crates/prometeu-kernel/src/fs/fs_backend.rs b/crates/console/prometeu-system/src/services/fs/fs_backend.rs similarity index 100% rename from crates/prometeu-kernel/src/fs/fs_backend.rs rename to crates/console/prometeu-system/src/services/fs/fs_backend.rs diff --git a/crates/prometeu-kernel/src/fs/fs_entry.rs b/crates/console/prometeu-system/src/services/fs/fs_entry.rs similarity index 100% rename from crates/prometeu-kernel/src/fs/fs_entry.rs rename to crates/console/prometeu-system/src/services/fs/fs_entry.rs diff --git a/crates/prometeu-kernel/src/fs/fs_error.rs b/crates/console/prometeu-system/src/services/fs/fs_error.rs similarity index 100% rename from crates/prometeu-kernel/src/fs/fs_error.rs rename to crates/console/prometeu-system/src/services/fs/fs_error.rs diff --git a/crates/prometeu-kernel/src/fs/fs_state.rs b/crates/console/prometeu-system/src/services/fs/fs_state.rs similarity index 100% rename from crates/prometeu-kernel/src/fs/fs_state.rs rename to crates/console/prometeu-system/src/services/fs/fs_state.rs diff --git a/crates/prometeu-kernel/src/fs/mod.rs b/crates/console/prometeu-system/src/services/fs/mod.rs similarity index 100% rename from crates/prometeu-kernel/src/fs/mod.rs rename to crates/console/prometeu-system/src/services/fs/mod.rs diff --git a/crates/prometeu-kernel/src/fs/virtual_fs.rs b/crates/console/prometeu-system/src/services/fs/virtual_fs.rs similarity index 100% rename from crates/prometeu-kernel/src/fs/virtual_fs.rs rename to crates/console/prometeu-system/src/services/fs/virtual_fs.rs diff --git a/crates/console/prometeu-system/src/services/mod.rs b/crates/console/prometeu-system/src/services/mod.rs new file mode 100644 index 00000000..57f1feea --- /dev/null +++ b/crates/console/prometeu-system/src/services/mod.rs @@ -0,0 +1 @@ +pub mod fs; \ No newline at end of file diff --git a/crates/prometeu-kernel/src/prometeu_os.rs b/crates/console/prometeu-system/src/virtual_machine_runtime.rs similarity index 93% rename from crates/prometeu-kernel/src/prometeu_os.rs rename to crates/console/prometeu-system/src/virtual_machine_runtime.rs index 0c9656b0..b2514fc8 100644 --- a/crates/prometeu-kernel/src/prometeu_os.rs +++ b/crates/console/prometeu-system/src/virtual_machine_runtime.rs @@ -1,28 +1,22 @@ -use prometeu_abi::syscalls::Syscall; +use prometeu_hal::syscalls::Syscall; use crate::fs::{FsBackend, FsState, VirtualFS}; -use prometeu_hardware_contract::{HardwareBridge, InputSignals}; -use prometeu_abi::log::{LogLevel, LogService, LogSource}; -use prometeu_abi::model::{BankType, Cartridge, Color}; -use prometeu_abi::telemetry::{CertificationConfig, Certifier, TelemetryFrame}; +use prometeu_hal::{HardwareBridge, InputSignals}; +use prometeu_hal::log::{LogLevel, LogService, LogSource}; +use prometeu_hal::telemetry::{CertificationConfig, Certifier, TelemetryFrame}; use std::collections::HashMap; use std::time::Instant; -use prometeu_abi::virtual_machine::{Value, VmFault}; -use prometeu_hardware_contract::{expect_bool, expect_int, HostContext, HostReturn, NativeInterface, SyscallId}; +use prometeu_abi::{Value, VmFault}; +use prometeu_hal::{expect_bool, expect_int, HostContext, HostReturn, NativeInterface, SyscallId}; +use prometeu_hal::asset::{BankType, LoadStatus, SlotRef}; +use prometeu_hal::button::Button; +use prometeu_hal::cartridge::{AppMode, Cartridge}; +use prometeu_hal::color::Color; +use prometeu_hal::sprite::Sprite; +use prometeu_hal::tile::Tile; use prometeu_vm::{LogicalFrameEndingReason, VirtualMachine}; -/// PrometeuOS (POS): The central system firmware and resource manager. -/// -/// POS is the "kernel" of the Prometeu console. It manages the lifecycle of -/// applications, handles hardware abstraction through Syscalls, and enforces -/// resource limits (CAP). -/// -/// ### Core Responsibilities: -/// - **Syscall Dispatching**: Implements the `NativeInterface` to connect the VM to hardware. -/// - **Resource Management**: Manages file handles, memory bank status, and cycle budgeting. -/// - **Filesystem Sandboxing**: Provides a virtualized filesystem (VFS) to the VM. -/// - **Telemetry & Certification**: Tracks performance and ensures apps stay within their budget. -/// - **Logging**: Provides a centralized log service for system and app events. -pub struct PrometeuOS { + +pub struct VirtualMachineRuntime { /// Host Tick Index: Incremented on every host hardware update (usually 60Hz). pub tick_index: u64, /// Logical Frame Index: Incremented only when an app successfully completes a full frame via `FRAME_SYNC`. @@ -51,7 +45,7 @@ pub struct PrometeuOS { pub current_app_id: u32, pub current_cartridge_title: String, pub current_cartridge_app_version: String, - pub current_cartridge_app_mode: prometeu_abi::model::AppMode, + pub current_cartridge_app_mode: AppMode, pub current_entrypoint: String, /// Rate-limiter to prevent apps from flooding the log buffer and killing performance. pub logs_written_this_frame: HashMap, @@ -76,7 +70,7 @@ pub struct PrometeuOS { boot_time: Instant, } -impl PrometeuOS { +impl VirtualMachineRuntime { /// Default number of cycles assigned to a single game frame. pub const CYCLES_PER_LOGICAL_FRAME: u64 = 100_000; /// Maximum number of cycles allowed to execute in a single host tick. @@ -105,7 +99,7 @@ impl PrometeuOS { current_app_id: 0, current_cartridge_title: String::new(), current_cartridge_app_version: String::new(), - current_cartridge_app_mode: prometeu_abi::model::AppMode::Game, + current_cartridge_app_mode: AppMode::Game, current_entrypoint: String::new(), logs_written_this_frame: HashMap::new(), telemetry_current: TelemetryFrame::default(), @@ -389,7 +383,7 @@ impl PrometeuOS { } // Helper for syscalls - pub fn get_button<'a>(&self, id: u32, hw: &'a dyn HardwareBridge) -> Option<&'a prometeu_abi::model::Button> { + pub fn get_button<'a>(&self, id: u32, hw: &'a dyn HardwareBridge) -> Option<&'a Button> { let pad = hw.pad(); match id { 0 => Some(pad.up()), @@ -429,13 +423,12 @@ impl PrometeuOS { #[cfg(test)] mod tests { - use prometeu_hardware::hardware::Hardware; -use prometeu_abi::virtual_machine::Value; - use prometeu_hardware_contract::{HostReturn, InputSignals}; + use prometeu_drivers::hardware::Hardware; +use prometeu_abi::Value; + use prometeu_hal::{HostReturn, InputSignals}; use super::*; - use prometeu_abi::model::{AppMode, Cartridge}; - fn call_syscall(os: &mut PrometeuOS, id: u32, vm: &mut VirtualMachine, hw: &mut dyn HardwareBridge) -> Result<(), VmFault> { + fn call_syscall(os: &mut VirtualMachineRuntime, id: u32, vm: &mut VirtualMachine, hw: &mut dyn HardwareBridge) -> Result<(), VmFault> { let args_count = Syscall::from_u32(id).expect(&format!("Invalid syscall id: 0x{:08X}", id)).args_count(); let mut args = Vec::new(); for _ in 0..args_count { @@ -452,7 +445,7 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_infinite_loop_budget_reset_bug() { - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); let mut vm = VirtualMachine::default(); let mut hw = Hardware::new(); let signals = InputSignals::default(); @@ -488,7 +481,7 @@ use prometeu_abi::virtual_machine::Value; // First tick os.tick(&mut vm, &signals, &mut hw); let cycles_after_tick_1 = vm.cycles; - assert!(cycles_after_tick_1 >= PrometeuOS::CYCLES_PER_LOGICAL_FRAME); + assert!(cycles_after_tick_1 >= VirtualMachineRuntime::CYCLES_PER_LOGICAL_FRAME); // Second tick - Now it SHOULD NOT gain more budget os.tick(&mut vm, &signals, &mut hw); @@ -501,7 +494,7 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_budget_reset_on_frame_sync() { - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); let mut vm = VirtualMachine::default(); let mut hw = Hardware::new(); let signals = InputSignals::default(); @@ -547,7 +540,7 @@ use prometeu_abi::virtual_machine::Value; // Should have stopped at FrameSync assert!(cycles_after_tick_1 > 0, "VM should have consumed some cycles"); - assert!(cycles_after_tick_1 < PrometeuOS::CYCLES_PER_LOGICAL_FRAME); + assert!(cycles_after_tick_1 < VirtualMachineRuntime::CYCLES_PER_LOGICAL_FRAME); // Second tick - Should reset the budget and run a bit more until the next FrameSync os.tick(&mut vm, &signals, &mut hw); @@ -558,28 +551,28 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_telemetry_cycles_budget() { - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); let mut vm = VirtualMachine::default(); let mut hw = Hardware::new(); let signals = InputSignals::default(); // Standard budget os.tick(&mut vm, &signals, &mut hw); - assert_eq!(os.telemetry_current.cycles_budget, PrometeuOS::CYCLES_PER_LOGICAL_FRAME); + assert_eq!(os.telemetry_current.cycles_budget, VirtualMachineRuntime::CYCLES_PER_LOGICAL_FRAME); // Custom budget via CAP let mut config = CertificationConfig::default(); config.enabled = true; config.cycles_budget_per_frame = Some(50000); - let mut os_custom = PrometeuOS::new(Some(config)); + let mut os_custom = VirtualMachineRuntime::new(Some(config)); os_custom.tick(&mut vm, &signals, &mut hw); assert_eq!(os_custom.telemetry_current.cycles_budget, 50000); } #[test] fn test_get_color_logic() { - let os = PrometeuOS::new(None); + let os = VirtualMachineRuntime::new(None); // Deve retornar a cor raw diretamente assert_eq!(os.get_color(0x07E0), Color::GREEN); @@ -590,7 +583,7 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_gfx_set_sprite_syscall_pops() { - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); let mut vm = VirtualMachine::default(); let mut hw = Hardware::new(); @@ -615,7 +608,7 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_gfx_set_sprite_with_swapped_arguments_repro() { - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); let mut vm = VirtualMachine::default(); let mut hw = Hardware::new(); @@ -642,7 +635,7 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_syscall_log_write_and_rate_limit() { - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); let mut vm = VirtualMachine::default(); let mut hw = Hardware::new(); @@ -717,7 +710,7 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_entrypoint_called_every_frame() { - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); let mut vm = VirtualMachine::default(); let mut hw = Hardware::new(); let signals = InputSignals::default(); @@ -771,7 +764,7 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_os_unknown_syscall_returns_trap() { - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); let mut vm = VirtualMachine::default(); let mut hw = Hardware::new(); let mut ret = HostReturn::new(&mut vm.operand_stack); @@ -787,7 +780,7 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_gfx_clear565_syscall() { let mut hw = Hardware::new(); - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); let mut stack = Vec::new(); // Success case @@ -814,7 +807,7 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_input_snapshots_syscalls() { let mut hw = Hardware::new(); - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); // Pad snapshot let mut stack = Vec::new(); @@ -835,7 +828,7 @@ use prometeu_abi::virtual_machine::Value; #[test] fn test_os_syscall_without_hardware_fails_graciously() { - let mut os = PrometeuOS::new(None); + let mut os = VirtualMachineRuntime::new(None); let mut stack = Vec::new(); let mut ret = HostReturn::new(&mut stack); @@ -849,7 +842,7 @@ use prometeu_abi::virtual_machine::Value; } } -impl NativeInterface for PrometeuOS { +impl NativeInterface for VirtualMachineRuntime { /// Dispatches a syscall from the VM to the native implementation. /// /// Syscalls are grouped by functionality: @@ -976,11 +969,11 @@ impl NativeInterface for PrometeuOS { let flip_y = expect_bool(args, 8)?; let priority = expect_int(args, 9)? as u8; - let bank_id = hw.assets().find_slot_by_name(&asset_name, prometeu_abi::model::BankType::TILES).unwrap_or(0); + let bank_id = hw.assets().find_slot_by_name(&asset_name, BankType::TILES).unwrap_or(0); if index < 512 { - *hw.gfx_mut().sprite_mut(index) = prometeu_abi::model::Sprite { - tile: prometeu_abi::model::Tile { id: tile_id, flip_x: false, flip_y: false, palette_id }, + *hw.gfx_mut().sprite_mut(index) = Sprite { + tile: Tile { id: tile_id, flip_x: false, flip_y: false, palette_id }, x, y, bank_id, @@ -1218,7 +1211,7 @@ impl NativeInterface for PrometeuOS { _ => return Err(VmFault::Trap(prometeu_bytecode::abi::TRAP_TYPE, "Expected number for pitch".into())), }; - hw.audio_mut().play(0, sample_id as u16, voice_id, volume, pan, pitch, 0, prometeu_hardware_contract::LoopMode::Off); + hw.audio_mut().play(0, sample_id as u16, voice_id, volume, pan, pitch, 0, prometeu_hal::LoopMode::Off); ret.push_null(); Ok(()) } @@ -1241,11 +1234,11 @@ impl NativeInterface for PrometeuOS { _ => return Err(VmFault::Trap(prometeu_bytecode::abi::TRAP_TYPE, "Expected number for pitch".into())), }; let loop_mode = match expect_int(args, 6)? { - 0 => prometeu_hardware_contract::LoopMode::Off, - _ => prometeu_hardware_contract::LoopMode::On, + 0 => prometeu_hal::LoopMode::Off, + _ => prometeu_hal::LoopMode::On, }; - let bank_id = hw.assets().find_slot_by_name(&asset_name, prometeu_abi::model::BankType::SOUNDS).unwrap_or(0); + let bank_id = hw.assets().find_slot_by_name(&asset_name, BankType::SOUNDS).unwrap_or(0); hw.audio_mut().play(bank_id, sample_id, voice_id, volume, pan, pitch, 0, loop_mode); ret.push_null(); @@ -1377,11 +1370,11 @@ impl NativeInterface for PrometeuOS { let slot_index = expect_int(args, 2)? as usize; let asset_type = match asset_type_val { - 0 => prometeu_abi::model::BankType::TILES, - 1 => prometeu_abi::model::BankType::SOUNDS, + 0 => BankType::TILES, + 1 => BankType::SOUNDS, _ => return Err(VmFault::Trap(prometeu_bytecode::abi::TRAP_TYPE, "Invalid asset type".to_string())), }; - let slot = prometeu_abi::model::SlotRef { asset_type, index: slot_index }; + let slot = SlotRef { asset_type, index: slot_index }; match hw.assets().load(&asset_id, slot) { Ok(handle) => { @@ -1395,12 +1388,12 @@ impl NativeInterface for PrometeuOS { let handle = expect_int(args, 0)? as u32; let status = hw.assets().status(handle); let status_val = match status { - prometeu_abi::model::LoadStatus::PENDING => 0, - prometeu_abi::model::LoadStatus::LOADING => 1, - prometeu_abi::model::LoadStatus::READY => 2, - prometeu_abi::model::LoadStatus::COMMITTED => 3, - prometeu_abi::model::LoadStatus::CANCELED => 4, - prometeu_abi::model::LoadStatus::ERROR => 5, + LoadStatus::PENDING => 0, + LoadStatus::LOADING => 1, + LoadStatus::READY => 2, + LoadStatus::COMMITTED => 3, + LoadStatus::CANCELED => 4, + LoadStatus::ERROR => 5, }; ret.push_int(status_val); Ok(()) @@ -1420,8 +1413,8 @@ impl NativeInterface for PrometeuOS { Syscall::BankInfo => { let asset_type_val = expect_int(args, 0)? as u32; let asset_type = match asset_type_val { - 0 => prometeu_abi::model::BankType::TILES, - 1 => prometeu_abi::model::BankType::SOUNDS, + 0 => BankType::TILES, + 1 => BankType::SOUNDS, _ => return Err(VmFault::Trap(prometeu_bytecode::abi::TRAP_TYPE, "Invalid asset type".to_string())), }; let info = hw.assets().bank_info(asset_type); @@ -1433,11 +1426,11 @@ impl NativeInterface for PrometeuOS { let asset_type_val = expect_int(args, 0)? as u32; let slot_index = expect_int(args, 1)? as usize; let asset_type = match asset_type_val { - 0 => prometeu_abi::model::BankType::TILES, - 1 => prometeu_abi::model::BankType::SOUNDS, + 0 => BankType::TILES, + 1 => BankType::SOUNDS, _ => return Err(VmFault::Trap(prometeu_bytecode::abi::TRAP_TYPE, "Invalid asset type".to_string())), }; - let slot = prometeu_abi::model::SlotRef { asset_type, index: slot_index }; + let slot = SlotRef { asset_type, index: slot_index }; let info = hw.assets().slot_info(slot); let json = serde_json::to_string(&info).unwrap_or_default(); ret.push_string(json); diff --git a/crates/console/prometeu-vm/Cargo.toml b/crates/console/prometeu-vm/Cargo.toml new file mode 100644 index 00000000..b20ac3db --- /dev/null +++ b/crates/console/prometeu-vm/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "prometeu-vm" +version = "0.1.0" +edition = "2024" +license.workspace = true + +[dependencies] +serde = { version = "1.0.228", features = ["derive"] } +prometeu-bytecode = { path = "../../compiler/prometeu-bytecode" } +prometeu-abi = { path = "../../compiler/prometeu-abi" } +prometeu-hal = { path = "../prometeu-hal" } diff --git a/crates/prometeu-vm/src/call_frame.rs b/crates/console/prometeu-vm/src/call_frame.rs similarity index 100% rename from crates/prometeu-vm/src/call_frame.rs rename to crates/console/prometeu-vm/src/call_frame.rs diff --git a/crates/prometeu-vm/src/lib.rs b/crates/console/prometeu-vm/src/lib.rs similarity index 60% rename from crates/prometeu-vm/src/lib.rs rename to crates/console/prometeu-vm/src/lib.rs index 7f2d292c..7f3683f1 100644 --- a/crates/prometeu-vm/src/lib.rs +++ b/crates/console/prometeu-vm/src/lib.rs @@ -4,13 +4,13 @@ mod scope_frame; pub mod local_addressing; pub mod verifier; -pub use prometeu_abi::virtual_machine::program::ProgramImage; -pub use prometeu_abi::virtual_machine::{Value, VmFault}; +pub use prometeu_abi::ProgramImage; +pub use prometeu_abi::{Value, VmFault}; pub use prometeu_bytecode::abi::TrapInfo; pub use prometeu_bytecode::opcode::OpCode; -pub use prometeu_hardware_contract::{ +pub use prometeu_hal::{ HostContext, HostReturn, NativeInterface, SyscallId, }; -pub type VmInitError = prometeu_abi::virtual_machine::VmInitError; +pub type VmInitError = prometeu_abi::VmInitError; pub use verifier::VerifierError; pub use virtual_machine::{BudgetReport, LogicalFrameEndingReason, VirtualMachine}; diff --git a/crates/prometeu-vm/src/local_addressing.rs b/crates/console/prometeu-vm/src/local_addressing.rs similarity index 100% rename from crates/prometeu-vm/src/local_addressing.rs rename to crates/console/prometeu-vm/src/local_addressing.rs diff --git a/crates/prometeu-vm/src/scope_frame.rs b/crates/console/prometeu-vm/src/scope_frame.rs similarity index 100% rename from crates/prometeu-vm/src/scope_frame.rs rename to crates/console/prometeu-vm/src/scope_frame.rs diff --git a/crates/prometeu-vm/src/verifier.rs b/crates/console/prometeu-vm/src/verifier.rs similarity index 99% rename from crates/prometeu-vm/src/verifier.rs rename to crates/console/prometeu-vm/src/verifier.rs index 725159d2..da1b018f 100644 --- a/crates/prometeu-vm/src/verifier.rs +++ b/crates/console/prometeu-vm/src/verifier.rs @@ -1,4 +1,4 @@ -use prometeu_abi::syscalls::Syscall; +use prometeu_hal::syscalls::Syscall; use prometeu_bytecode::decoder::{decode_next, DecodeError}; use prometeu_bytecode::opcode::OpCode; use prometeu_bytecode::opcode_spec::OpCodeSpecExt; diff --git a/crates/prometeu-vm/src/virtual_machine.rs b/crates/console/prometeu-vm/src/virtual_machine.rs similarity index 99% rename from crates/prometeu-vm/src/virtual_machine.rs rename to crates/console/prometeu-vm/src/virtual_machine.rs index 5b7138b1..7469cfdb 100644 --- a/crates/prometeu-vm/src/virtual_machine.rs +++ b/crates/console/prometeu-vm/src/virtual_machine.rs @@ -886,7 +886,7 @@ impl VirtualMachine { OpCode::Syscall => { let pc_at_syscall = start_pc as u32; let id = instr.imm_u32().map_err(|e| LogicalFrameEndingReason::Panic(format!("{:?}", e)))?; - let syscall = prometeu_abi::syscalls::Syscall::from_u32(id).ok_or_else(|| { + let syscall = prometeu_hal::syscalls::Syscall::from_u32(id).ok_or_else(|| { self.trap(prometeu_bytecode::abi::TRAP_INVALID_SYSCALL, OpCode::Syscall as u16, format!("Unknown syscall: 0x{:08X}", id), pc_at_syscall) })?; @@ -950,29 +950,6 @@ impl VirtualMachine { Ok(entry) } - // /// Resolves a `GateId` to a mutable reference to its `GateEntry` or returns a trap reason. - // fn resolve_gate_mut(&mut self, gate_id: GateId, opcode: u16, pc: u32) -> Result<&mut GateEntry, LogicalFrameEndingReason> { - // let idx = gate_id as usize; - // if idx >= self.gate_pool.len() { - // return Err(self.trap( - // TRAP_INVALID_GATE, - // opcode, - // format!("Invalid gate id: {}", gate_id), - // pc, - // )); - // } - // if !self.gate_pool[idx].alive { - // return Err(self.trap( - // TRAP_DEAD_GATE, - // opcode, - // format!("Dead gate id: {}", gate_id), - // pc, - // )); - // } - // // This borrow is safe because we validated bounds and liveness without using closures. - // Ok(&mut self.gate_pool[idx]) - // } - pub fn trap(&self, code: u32, opcode: u16, message: String, pc: u32) -> LogicalFrameEndingReason { LogicalFrameEndingReason::Trap(self.program.create_trap(code, opcode, message, pc)) } @@ -1036,7 +1013,7 @@ mod tests { use crate::{HostReturn, Value, VmFault}; use prometeu_bytecode::abi::SourceSpan; use prometeu_bytecode::FunctionMeta; - use prometeu_hardware_contract::expect_int; + use prometeu_hal::expect_int; struct MockNative; impl NativeInterface for MockNative { diff --git a/crates/host/prometeu-host-desktop-winit/Cargo.toml b/crates/host/prometeu-host-desktop-winit/Cargo.toml new file mode 100644 index 00000000..e1347381 --- /dev/null +++ b/crates/host/prometeu-host-desktop-winit/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "prometeu-host-desktop-winit" +version = "0.1.0" +edition = "2024" +license.workspace = true +repository.workspace = true + +[[bin]] +name = "prometeu-host-desktop-winit" +path = "src/main.rs" + +[package.metadata.dist] +dist = true +include = ["../../VERSION.txt"] + +[dependencies] +prometeu-abi = { path = "../../compiler/prometeu-abi" } +prometeu-firmware = { path = "../../console/prometeu-firmware" } +prometeu-system = { path = "../../console/prometeu-system" } +prometeu-drivers = { path = "../../console/prometeu-drivers" } +prometeu-hal = { path= "../../console/prometeu-hal" } +winit = "0.30.12" +pixels = "0.15.0" +cpal = "0.15.3" +ringbuf = "0.4.7" +serde_json = "1.0.149" +clap = { version = "4.5", features = ["derive"] } \ No newline at end of file diff --git a/crates/prometeu-runtime-desktop/README.md b/crates/host/prometeu-host-desktop-winit/README.md similarity index 100% rename from crates/prometeu-runtime-desktop/README.md rename to crates/host/prometeu-host-desktop-winit/README.md diff --git a/crates/prometeu-runtime-desktop/src/audio.rs b/crates/host/prometeu-host-desktop-winit/src/audio.rs similarity index 98% rename from crates/prometeu-runtime-desktop/src/audio.rs rename to crates/host/prometeu-host-desktop-winit/src/audio.rs index 2aadab7b..39777d05 100644 --- a/crates/prometeu-runtime-desktop/src/audio.rs +++ b/crates/host/prometeu-host-desktop-winit/src/audio.rs @@ -1,10 +1,10 @@ use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; -use prometeu_hardware::{AudioCommand, Channel, MAX_CHANNELS, OUTPUT_SAMPLE_RATE}; +use prometeu_drivers::{AudioCommand, Channel, MAX_CHANNELS, OUTPUT_SAMPLE_RATE}; use ringbuf::traits::{Consumer, Producer, Split}; use ringbuf::HeapRb; use std::sync::Arc; use std::time::Duration; -use prometeu_hardware_contract::LoopMode; +use prometeu_hal::LoopMode; pub struct HostAudio { pub producer: Option>>>, diff --git a/crates/prometeu-runtime-desktop/src/cap.rs b/crates/host/prometeu-host-desktop-winit/src/cap.rs similarity index 96% rename from crates/prometeu-runtime-desktop/src/cap.rs rename to crates/host/prometeu-host-desktop-winit/src/cap.rs index ed36e5b8..d4d5eb7a 100644 --- a/crates/prometeu-runtime-desktop/src/cap.rs +++ b/crates/host/prometeu-host-desktop-winit/src/cap.rs @@ -1,4 +1,4 @@ -use prometeu_abi::telemetry::CertificationConfig; +use prometeu_hal::telemetry::CertificationConfig; pub fn load_cap_config(path: &str) -> Option { let content = std::fs::read_to_string(path).ok()?; diff --git a/crates/prometeu-runtime-desktop/src/debugger.rs b/crates/host/prometeu-host-desktop-winit/src/debugger.rs similarity index 98% rename from crates/prometeu-runtime-desktop/src/debugger.rs rename to crates/host/prometeu-host-desktop-winit/src/debugger.rs index 36e43689..a29ccb44 100644 --- a/crates/prometeu-runtime-desktop/src/debugger.rs +++ b/crates/host/prometeu-host-desktop-winit/src/debugger.rs @@ -1,9 +1,9 @@ -use prometeu_abi::debugger_protocol::*; +use prometeu_hal::debugger_protocol::*; use prometeu_firmware::{BootTarget, Firmware}; -use prometeu_abi::model::CartridgeLoader; use std::io::{Read, Write}; use std::net::{TcpListener, TcpStream}; -use prometeu_hardware::hardware::Hardware; +use prometeu_drivers::hardware::Hardware; +use prometeu_hal::cartridge_loader::CartridgeLoader; /// Host-side implementation of the PROMETEU DevTools Protocol. /// diff --git a/crates/prometeu-runtime-desktop/src/fs_backend.rs b/crates/host/prometeu-host-desktop-winit/src/fs_backend.rs similarity index 98% rename from crates/prometeu-runtime-desktop/src/fs_backend.rs rename to crates/host/prometeu-host-desktop-winit/src/fs_backend.rs index 2462e342..95de2237 100644 --- a/crates/prometeu-runtime-desktop/src/fs_backend.rs +++ b/crates/host/prometeu-host-desktop-winit/src/fs_backend.rs @@ -1,6 +1,6 @@ use std::fs; use std::path::PathBuf; -use prometeu_kernel::fs::{FsBackend, FsEntry, FsError}; +use prometeu_system::fs::{FsBackend, FsEntry, FsError}; pub struct HostDirBackend { root: PathBuf, diff --git a/crates/prometeu-runtime-desktop/src/input.rs b/crates/host/prometeu-host-desktop-winit/src/input.rs similarity index 96% rename from crates/prometeu-runtime-desktop/src/input.rs rename to crates/host/prometeu-host-desktop-winit/src/input.rs index 3e506daf..91e23967 100644 --- a/crates/prometeu-runtime-desktop/src/input.rs +++ b/crates/host/prometeu-host-desktop-winit/src/input.rs @@ -1,8 +1,8 @@ use winit::event::{ElementState, MouseButton, WindowEvent}; use winit::keyboard::{KeyCode, PhysicalKey}; use winit::window::Window; -use prometeu_hardware::hardware::Hardware; -use prometeu_hardware_contract::InputSignals; +use prometeu_drivers::hardware::Hardware; +use prometeu_hal::InputSignals; pub struct HostInputHandler { pub signals: InputSignals, diff --git a/crates/prometeu-runtime-desktop/src/lib.rs b/crates/host/prometeu-host-desktop-winit/src/lib.rs similarity index 100% rename from crates/prometeu-runtime-desktop/src/lib.rs rename to crates/host/prometeu-host-desktop-winit/src/lib.rs diff --git a/crates/prometeu-runtime-desktop/src/log_sink.rs b/crates/host/prometeu-host-desktop-winit/src/log_sink.rs similarity index 95% rename from crates/prometeu-runtime-desktop/src/log_sink.rs rename to crates/host/prometeu-host-desktop-winit/src/log_sink.rs index 27c9dcfb..12a5c0b3 100644 --- a/crates/prometeu-runtime-desktop/src/log_sink.rs +++ b/crates/host/prometeu-host-desktop-winit/src/log_sink.rs @@ -1,4 +1,4 @@ -use prometeu_abi::log::{LogEvent, LogLevel, LogSource}; +use prometeu_hal::log::{LogEvent, LogLevel, LogSource}; pub struct HostConsoleSink { last_seq: Option, diff --git a/crates/prometeu-runtime-desktop/src/main.rs b/crates/host/prometeu-host-desktop-winit/src/main.rs similarity index 58% rename from crates/prometeu-runtime-desktop/src/main.rs rename to crates/host/prometeu-host-desktop-winit/src/main.rs index 6219c316..55c2ac24 100644 --- a/crates/prometeu-runtime-desktop/src/main.rs +++ b/crates/host/prometeu-host-desktop-winit/src/main.rs @@ -1,3 +1,3 @@ fn main() -> Result<(), Box> { - prometeu_runtime_desktop::run() + prometeu_host_desktop_winit::run() } \ No newline at end of file diff --git a/crates/prometeu-runtime-desktop/src/runner.rs b/crates/host/prometeu-host-desktop-winit/src/runner.rs similarity index 98% rename from crates/prometeu-runtime-desktop/src/runner.rs rename to crates/host/prometeu-host-desktop-winit/src/runner.rs index 05d35ee8..a088b039 100644 --- a/crates/prometeu-runtime-desktop/src/runner.rs +++ b/crates/host/prometeu-host-desktop-winit/src/runner.rs @@ -15,10 +15,10 @@ use winit::event::{ElementState, WindowEvent}; use winit::event_loop::{ActiveEventLoop, ControlFlow}; use winit::keyboard::{KeyCode, PhysicalKey}; use winit::window::{Window, WindowAttributes, WindowId}; -use prometeu_abi::model::Color; -use prometeu_abi::telemetry::CertificationConfig; -use prometeu_hardware::hardware::Hardware; -use prometeu_hardware::AudioCommand; +use prometeu_hal::telemetry::CertificationConfig; +use prometeu_drivers::hardware::Hardware; +use prometeu_drivers::AudioCommand; +use prometeu_hal::color::Color; /// The Desktop implementation of the PROMETEU Runtime. /// @@ -260,7 +260,7 @@ impl ApplicationHandler for HostRunner { // 2. Maintain filesystem connection if it was lost (e.g., directory removed). if let Some(root) = &self.fs_root { - use prometeu_kernel::fs::FsState; + use prometeu_system::fs::FsState; if matches!(self.firmware.os.fs_state, FsState::Unmounted | FsState::Error(_)) { if std::path::Path::new(root).exists() { let backend = HostDirBackend::new(root); @@ -347,7 +347,7 @@ mod tests { use prometeu_firmware::BootTarget; use std::io::{Read, Write}; use std::net::TcpStream; - use prometeu_abi::debugger_protocol::DEVTOOLS_PROTOCOL_VERSION; + use prometeu_hal::debugger_protocol::DEVTOOLS_PROTOCOL_VERSION; #[test] fn test_debug_port_opens() { diff --git a/crates/prometeu-runtime-desktop/src/stats.rs b/crates/host/prometeu-host-desktop-winit/src/stats.rs similarity index 98% rename from crates/prometeu-runtime-desktop/src/stats.rs rename to crates/host/prometeu-host-desktop-winit/src/stats.rs index 25242a0d..906e7231 100644 --- a/crates/prometeu-runtime-desktop/src/stats.rs +++ b/crates/host/prometeu-host-desktop-winit/src/stats.rs @@ -1,7 +1,7 @@ use prometeu_firmware::Firmware; use std::time::{Duration, Instant}; use winit::window::Window; -use prometeu_hardware::hardware::Hardware; +use prometeu_drivers::hardware::Hardware; pub struct HostStats { pub last_stats_update: Instant, diff --git a/crates/prometeu-runtime-desktop/src/utilities.rs b/crates/host/prometeu-host-desktop-winit/src/utilities.rs similarity index 100% rename from crates/prometeu-runtime-desktop/src/utilities.rs rename to crates/host/prometeu-host-desktop-winit/src/utilities.rs diff --git a/crates/frontend-api/Cargo.toml b/crates/language-api/Cargo.toml similarity index 78% rename from crates/frontend-api/Cargo.toml rename to crates/language-api/Cargo.toml index f9cf9800..c1241411 100644 --- a/crates/frontend-api/Cargo.toml +++ b/crates/language-api/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "frontend-api" +name = "language-api" version = "0.1.0" edition = "2021" license = "MIT" -description = "Canonical frontend contract for Prometeu Backend: identifiers, references, and strict Frontend trait." +description = "Canonical language contract for Prometeu Backend: identifiers, references, and strict Frontend trait." repository = "https://github.com/prometeu/runtime" [dependencies] diff --git a/crates/frontend-api/src/lib.rs b/crates/language-api/src/lib.rs similarity index 100% rename from crates/frontend-api/src/lib.rs rename to crates/language-api/src/lib.rs diff --git a/crates/frontend-api/src/traits.rs b/crates/language-api/src/traits.rs similarity index 100% rename from crates/frontend-api/src/traits.rs rename to crates/language-api/src/traits.rs diff --git a/crates/frontend-api/src/types.rs b/crates/language-api/src/types.rs similarity index 100% rename from crates/frontend-api/src/types.rs rename to crates/language-api/src/types.rs diff --git a/crates/prometeu-abi/src/lib.rs b/crates/prometeu-abi/src/lib.rs deleted file mode 100644 index 1005fce9..00000000 --- a/crates/prometeu-abi/src/lib.rs +++ /dev/null @@ -1,9 +0,0 @@ -//! Prometeu ABI: tipos e contratos compartilhados entre os crates. - -pub mod model; -pub mod log; -pub mod telemetry; -pub mod debugger_protocol; -pub mod syscalls; - -pub mod virtual_machine; diff --git a/crates/prometeu-abi/src/model/mod.rs b/crates/prometeu-abi/src/model/mod.rs deleted file mode 100644 index ded41a56..00000000 --- a/crates/prometeu-abi/src/model/mod.rs +++ /dev/null @@ -1,25 +0,0 @@ -mod asset; -mod color; -mod button; -mod tile; -mod tile_layer; -mod tile_bank; -mod sound_bank; -mod sprite; -mod sample; -mod cartridge; -mod cartridge_loader; -mod window; - -pub use asset::{AssetEntry, BankStats, BankType, HandleId, LoadStatus, PreloadEntry, SlotRef, SlotStats}; -pub use button::{Button, ButtonId}; -pub use cartridge::{AppMode, Cartridge, CartridgeDTO, CartridgeError}; -pub use cartridge_loader::{CartridgeLoader, DirectoryCartridgeLoader, PackedCartridgeLoader}; -pub use color::Color; -pub use sample::Sample; -pub use sound_bank::SoundBank; -pub use sprite::Sprite; -pub use tile::Tile; -pub use tile_bank::{TileBank, TileSize}; -pub use tile_layer::{HudTileLayer, ScrollableTileLayer, TileMap}; -pub use window::{Rect, Window, WindowId}; diff --git a/crates/prometeu-abi/src/virtual_machine/mod.rs b/crates/prometeu-abi/src/virtual_machine/mod.rs deleted file mode 100644 index 44f635d5..00000000 --- a/crates/prometeu-abi/src/virtual_machine/mod.rs +++ /dev/null @@ -1,14 +0,0 @@ -mod value; -mod vm_init_error; -pub mod program; - -pub use program::ProgramImage; -pub use value::Value; -pub use vm_init_error::VmInitError; - -#[derive(Debug, PartialEq, Clone)] -pub enum VmFault { - Trap(u32, String), - Panic(String), - Unavailable, -} diff --git a/crates/prometeu-compiler/tests/generate_canonical_goldens.rs b/crates/prometeu-compiler/tests/generate_canonical_goldens.rs deleted file mode 100644 index 9cf8caba..00000000 --- a/crates/prometeu-compiler/tests/generate_canonical_goldens.rs +++ /dev/null @@ -1,67 +0,0 @@ -use prometeu_bytecode::disasm::disasm; -use prometeu_bytecode::BytecodeLoader; -use prometeu_compiler::compiler::compile; -use prometeu_compiler::frontends::pbs::parser::Parser; -use prometeu_compiler::common::spans::FileId; -use prometeu_analysis::NameInterner; -use std::fs; -use std::path::Path; - -#[test] -fn generate_canonical_goldens() { - println!("CWD: {:?}", std::env::current_dir().unwrap()); - let project_dir = Path::new("../../test-cartridges/canonical"); - if !project_dir.exists() { - // Fallback for when running from project root (some IDEs/environments) - let project_dir = Path::new("test-cartridges/canonical"); - if !project_dir.exists() { - panic!("Could not find project directory at ../../test-cartridges/canonical or test-cartridges/canonical"); - } - } - - // We need a stable path for the actual compilation which might use relative paths internally - let project_dir = if Path::new("../../test-cartridges/canonical").exists() { - Path::new("../../test-cartridges/canonical") - } else { - Path::new("test-cartridges/canonical") - }; - - let unit = compile(project_dir).map_err(|e| { - println!("Compilation Error: {}", e); - e - }).expect("Failed to compile canonical cartridge"); - - let golden_dir = project_dir.join("golden"); - fs::create_dir_all(&golden_dir).unwrap(); - - // 1. Bytecode (.pbc) - fs::write(golden_dir.join("program.pbc"), &unit.rom).unwrap(); - - // 2. Disassembly - let module = BytecodeLoader::load(&unit.rom).expect("Failed to load BytecodeModule"); - let instrs = disasm(&module.code).expect("Failed to disassemble"); - let mut disasm_text = String::new(); - for instr in instrs { - let operands_str = instr.operands.iter() - .map(|o| format!("{:?}", o)) - .collect::>() - .join(" "); - let line = if operands_str.is_empty() { - format!("{:04X} {:?}\n", instr.pc, instr.opcode) - } else { - format!("{:04X} {:?} {}\n", instr.pc, instr.opcode, operands_str.trim()) - }; - disasm_text.push_str(&line); - } - fs::write(golden_dir.join("program.disasm.txt"), disasm_text).unwrap(); - - // 3. AST JSON - let source = fs::read_to_string(project_dir.join("src/main/modules/main.pbs")).unwrap(); - let mut interner = NameInterner::new(); - let mut parser = Parser::new(&source, FileId(0), &mut interner); - let parsed = parser.parse_file().expect("Failed to parse AST"); - let ast_json = serde_json::to_string_pretty(parsed.arena.kind(parsed.root)).unwrap(); - fs::write(golden_dir.join("ast.json"), ast_json).unwrap(); - - println!("Golden artifacts generated in test-cartridges/canonical/golden/"); -} diff --git a/crates/prometeu-firmware/Cargo.toml b/crates/prometeu-firmware/Cargo.toml deleted file mode 100644 index b78f4e40..00000000 --- a/crates/prometeu-firmware/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "prometeu-firmware" -version = "0.1.0" -edition = "2024" -license.workspace = true - -[dependencies] -prometeu-hardware = { path = "../prometeu-hardware" } -prometeu-vm = { path = "../prometeu-vm" } -prometeu-kernel = { path = "../prometeu-kernel" } -prometeu-bytecode = { path = "../prometeu-bytecode" } -prometeu-abi = { path = "../prometeu-abi" } -prometeu-hardware-contract = { path = "../prometeu-hardware-contract" } -serde = { version = "1.0.228", features = ["derive"] } -serde_json = "1.0.149" diff --git a/crates/prometeu-firmware/src/lib.rs b/crates/prometeu-firmware/src/lib.rs deleted file mode 100644 index 699e6db7..00000000 --- a/crates/prometeu-firmware/src/lib.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod firmware; -pub mod prometeu_hub; - -pub use firmware::*; -pub use prometeu_hub::*; diff --git a/crates/prometeu-hardware/tests/heartbeat.rs b/crates/prometeu-hardware/tests/heartbeat.rs deleted file mode 100644 index 25c8ce29..00000000 --- a/crates/prometeu-hardware/tests/heartbeat.rs +++ /dev/null @@ -1,74 +0,0 @@ -use std::fs; -use std::path::Path; -use prometeu_abi::virtual_machine::{Value, VmFault}; -use prometeu_hardware::hardware::Hardware; -use prometeu_hardware_contract::{HostContext, HostReturn, NativeInterface}; -use prometeu_vm::{LogicalFrameEndingReason, VirtualMachine}; - -struct MockNative; -impl NativeInterface for MockNative { - fn syscall(&mut self, id: u32, _args: &[Value], ret: &mut HostReturn, _ctx: &mut HostContext) -> Result<(), VmFault> { - if id == 0x2010 { // InputPadSnapshot - for _ in 0..48 { - ret.push_bool(false); - } - } else if id == 0x2011 { // InputTouchSnapshot - for _ in 0..6 { - ret.push_int(0); - } - } else { - // Push one result for others that might expect it - // Based on results_count() in syscalls.rs, most return 1 except GfxClear565 (0) - if id != 0x1010 { - ret.push_null(); - } - } - Ok(()) - } -} - -#[test] -fn test_canonical_cartridge_heartbeat() { - let mut pbc_path = Path::new("../../test-cartridges/canonical/golden/program.pbc").to_path_buf(); - if !pbc_path.exists() { - pbc_path = Path::new("test-cartridges/canonical/golden/program.pbc").to_path_buf(); - } - - let pbc_bytes = fs::read(pbc_path).expect("Failed to read canonical PBC. Did you run the generation test?"); - - // Determine entrypoint from the compiled module exports - let entry_symbol = "src/main/modules:frame"; - - let mut vm = VirtualMachine::new(vec![], vec![]); - vm.initialize(pbc_bytes, entry_symbol).expect("Failed to initialize VM with canonical cartridge"); - vm.prepare_call(entry_symbol); - - let mut native = MockNative; - let mut hw = Hardware::new(); - let mut ctx = HostContext::new(Some(&mut hw)); - - // Run for a reasonable budget - let report = vm.run_budget(1000, &mut native, &mut ctx).expect("VM failed to run"); - - // Acceptance criteria: - // 1. No traps - match report.reason { - LogicalFrameEndingReason::Trap(trap) => panic!("VM trapped: {:?}", trap), - LogicalFrameEndingReason::Panic(msg) => panic!("VM panicked: {}", msg), - LogicalFrameEndingReason::Halted => {}, - LogicalFrameEndingReason::EndOfRom => {}, - LogicalFrameEndingReason::FrameSync => {}, - LogicalFrameEndingReason::BudgetExhausted => {}, - LogicalFrameEndingReason::Breakpoint => {}, - } - - // 2. Deterministic output state (if any) - // Observação: a PVM agora sinaliza FRAME_SYNC imediatamente antes do RET do entry point. - // Quando o motivo é FRAME_SYNC, não exigimos pilha vazia (a limpeza final ocorre após o RET). - // Para os demais motivos (RET/Halted/EndOfRom), a pilha deve estar vazia para frame(): void. - if !matches!(report.reason, LogicalFrameEndingReason::FrameSync) { - assert_eq!(vm.operand_stack.len(), 0, "Stack should be empty after frame() execution"); - } - - println!("Heartbeat test passed!"); -} diff --git a/crates/prometeu-kernel/Cargo.toml b/crates/prometeu-kernel/Cargo.toml deleted file mode 100644 index 1c736074..00000000 --- a/crates/prometeu-kernel/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "prometeu-kernel" -version = "0.1.0" -edition = "2024" -license.workspace = true - -[dependencies] -serde_json = "1.0.149" -prometeu-vm = { path = "../prometeu-vm" } -prometeu-bytecode = { path = "../prometeu-bytecode" } -prometeu-abi = { path = "../prometeu-abi" } -prometeu-hardware-contract = { path = "../prometeu-hardware-contract" } - -[dev-dependencies] -prometeu-hardware = { path = "../prometeu-hardware" } diff --git a/crates/prometeu-kernel/src/lib.rs b/crates/prometeu-kernel/src/lib.rs deleted file mode 100644 index 15408388..00000000 --- a/crates/prometeu-kernel/src/lib.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod fs; -mod prometeu_os; - -pub use prometeu_os::PrometeuOS; diff --git a/crates/prometeu-runtime-desktop/Cargo.toml b/crates/prometeu-runtime-desktop/Cargo.toml deleted file mode 100644 index 220ae59c..00000000 --- a/crates/prometeu-runtime-desktop/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "prometeu-runtime-desktop" -version = "0.1.0" -edition = "2024" -license.workspace = true -repository.workspace = true - -[[bin]] -name = "prometeu-runtime-desktop" -path = "src/main.rs" - -[package.metadata.dist] -dist = true -include = ["../../VERSION.txt"] - -[dependencies] -prometeu-abi = { path = "../prometeu-abi" } -prometeu-firmware = { path = "../prometeu-firmware" } -prometeu-kernel = { path = "../prometeu-kernel" } -prometeu-hardware = { path = "../prometeu-hardware" } -prometeu-hardware-contract = { path="../prometeu-hardware-contract" } -winit = "0.30.12" -pixels = "0.15.0" -cpal = "0.15.3" -ringbuf = "0.4.7" -serde_json = "1.0.149" -clap = { version = "4.5", features = ["derive"] } \ No newline at end of file diff --git a/crates/prometeu-vm/Cargo.toml b/crates/prometeu-vm/Cargo.toml deleted file mode 100644 index 14c81507..00000000 --- a/crates/prometeu-vm/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "prometeu-vm" -version = "0.1.0" -edition = "2024" -license.workspace = true - -[dependencies] -serde = { version = "1.0.228", features = ["derive"] } -prometeu-bytecode = { path = "../prometeu-bytecode" } -prometeu-abi = { path = "../prometeu-abi" } -prometeu-hardware-contract = { path = "../prometeu-hardware-contract" } diff --git a/crates/prometeu/src/bin/prometeu-runtime.rs b/crates/prometeu/src/bin/prometeu-runtime.rs deleted file mode 100644 index d662a579..00000000 --- a/crates/prometeu/src/bin/prometeu-runtime.rs +++ /dev/null @@ -1 +0,0 @@ -fn main() -> Result<(), Box> { prometeu_runtime_desktop::run() } diff --git a/crates/prometeu/Cargo.toml b/crates/tools/prometeu-cli/Cargo.toml similarity index 61% rename from crates/prometeu/Cargo.toml rename to crates/tools/prometeu-cli/Cargo.toml index 77a8de2c..0a821982 100644 --- a/crates/prometeu/Cargo.toml +++ b/crates/tools/prometeu-cli/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "prometeu" +name = "prometeu-cli" version = "0.1.0" edition = "2024" license.workspace = true @@ -20,12 +20,12 @@ path = "src/bin/prometeuc.rs" [package.metadata.dist] dist = true include = [ - "../../VERSION.txt", - "../../dist-staging/devtools/debugger-protocol" + "../../../VERSION.txt", + "../../../dist-staging/devtools/debugger-protocol" ] [dependencies] clap = { version = "4.5", features = ["derive"] } -prometeu-runtime-desktop = { path = "../prometeu-runtime-desktop" } -prometeu-compiler = { path = "../prometeu-compiler" } +prometeu-host-desktop-winit = { path = "../../host/prometeu-host-desktop-winit" } +prometeu-compiler = { path = "../../compiler/prometeu-compiler" } anyhow = "1.0.100" diff --git a/crates/prometeu/README.md b/crates/tools/prometeu-cli/README.md similarity index 73% rename from crates/prometeu/README.md rename to crates/tools/prometeu-cli/README.md index 7dcfded6..0d29baa4 100644 --- a/crates/prometeu/README.md +++ b/crates/tools/prometeu-cli/README.md @@ -13,4 +13,4 @@ The `prometeu` binary acts as the unified front-end for the ecosystem. It does n ## How it works -The dispatcher locates sibling binaries (`prometeu-runtime-desktop`, `prometeuc`, etc.) in the same directory where it is installed. It inherits `stdin`, `stdout`, and `stderr`, and propagates the exit code of the called process. +The dispatcher locates sibling binaries (`prometeu-host-desktop-winit`, `prometeuc`, etc.) in the same directory where it is installed. It inherits `stdin`, `stdout`, and `stderr`, and propagates the exit code of the called process. diff --git a/crates/tools/prometeu-cli/src/bin/prometeu-runtime.rs b/crates/tools/prometeu-cli/src/bin/prometeu-runtime.rs new file mode 100644 index 00000000..f13bd332 --- /dev/null +++ b/crates/tools/prometeu-cli/src/bin/prometeu-runtime.rs @@ -0,0 +1 @@ +fn main() -> Result<(), Box> { prometeu_host_desktop_winit::run() } diff --git a/crates/prometeu/src/bin/prometeuc.rs b/crates/tools/prometeu-cli/src/bin/prometeuc.rs similarity index 100% rename from crates/prometeu/src/bin/prometeuc.rs rename to crates/tools/prometeu-cli/src/bin/prometeuc.rs diff --git a/crates/prometeu/src/main.rs b/crates/tools/prometeu-cli/src/main.rs similarity index 97% rename from crates/prometeu/src/main.rs rename to crates/tools/prometeu-cli/src/main.rs index 1ec3a6e0..139b8412 100644 --- a/crates/prometeu/src/main.rs +++ b/crates/tools/prometeu-cli/src/main.rs @@ -8,7 +8,7 @@ use std::process::Command; /// The main entry point for the user. This binary does not implement /// compilation or execution logic itself; instead, it acts as a smart /// front-end that locates and dispatches commands to specialized -/// components like `prometeu-runtime-desktop` or `prometeu-compiler`. +/// components like `prometeu-host-desktop-winit` or `prometeu-compiler`. #[derive(Parser)] #[command(name = "prometeu")] #[command(about = "Dispatcher for the Prometeu ecosystem", long_about = None)] @@ -76,7 +76,7 @@ fn main() { let cli = Cli::parse(); let exe_dir = match env::current_exe() { - Ok(exe_path) => exe_path.parent().unwrap_or_else(|| Path::new(".")).to_path_buf(), + Ok(exe_path) => exe_path.parent().unwrap_or_else(|| Path::new("../../../..")).to_path_buf(), Err(e) => { eprintln!("Error obtaining executable path: {}", e); std::process::exit(1); diff --git a/crates/prometeu-lsp/Cargo.toml b/crates/tools/prometeu-lsp/Cargo.toml similarity index 60% rename from crates/prometeu-lsp/Cargo.toml rename to crates/tools/prometeu-lsp/Cargo.toml index daac89a0..9ba9de37 100644 --- a/crates/prometeu-lsp/Cargo.toml +++ b/crates/tools/prometeu-lsp/Cargo.toml @@ -8,5 +8,5 @@ license = "MIT" tower-lsp = "0.20" tokio = { version = "1", features = ["full"] } tokio-util = { version = "0.7" } -prometeu-analysis = { path = "../prometeu-analysis" } -prometeu-compiler = { path = "../prometeu-compiler" } +prometeu-analysis = { path = "../../compiler/prometeu-analysis" } +prometeu-compiler = { path = "../../compiler/prometeu-compiler" } diff --git a/crates/prometeu-lsp/src/analysis_db.rs b/crates/tools/prometeu-lsp/src/analysis_db.rs similarity index 100% rename from crates/prometeu-lsp/src/analysis_db.rs rename to crates/tools/prometeu-lsp/src/analysis_db.rs diff --git a/crates/prometeu-lsp/src/main.rs b/crates/tools/prometeu-lsp/src/main.rs similarity index 100% rename from crates/prometeu-lsp/src/main.rs rename to crates/tools/prometeu-lsp/src/main.rs diff --git a/crates/prometeu-lsp/src/rebuild.rs b/crates/tools/prometeu-lsp/src/rebuild.rs similarity index 100% rename from crates/prometeu-lsp/src/rebuild.rs rename to crates/tools/prometeu-lsp/src/rebuild.rs diff --git a/crates/prometeu-lsp/tests/adapters.rs b/crates/tools/prometeu-lsp/tests/adapters.rs similarity index 100% rename from crates/prometeu-lsp/tests/adapters.rs rename to crates/tools/prometeu-lsp/tests/adapters.rs diff --git a/test-cartridges/canonical/golden/program.pbc b/test-cartridges/canonical/golden/program.pbc index 5a70490d..3646ac85 100644 Binary files a/test-cartridges/canonical/golden/program.pbc and b/test-cartridges/canonical/golden/program.pbc differ