From bc4146b98cf5e87154c62c11300286b732c7118d Mon Sep 17 00:00:00 2001 From: Michael Maloney Date: Wed, 8 May 2024 06:40:00 +0000 Subject: [PATCH] Progress. --- src/db.rs | 28 ---------------------------- src/db/packageq.rs | 8 ++++++++ src/db/structureq.rs | 2 +- src/db/typecheckq.rs | 3 ++- src/elab.rs | 4 +--- src/hir.rs | 7 ------- src/sim.rs | 3 +-- src/tests.rs | 27 +++++++++++++++++++++++++-- 8 files changed, 38 insertions(+), 44 deletions(-) diff --git a/src/db.rs b/src/db.rs index 1946c66..908758d 100644 --- a/src/db.rs +++ b/src/db.rs @@ -9,7 +9,6 @@ pub use typecheckq::TypecheckQ; pub use packageq::PackageQ; use std::sync::Arc; -use crate::hir; use crate::common::*; #[salsa::database( @@ -34,30 +33,3 @@ pub fn compile(input: &str) -> VirdantResult<()> { package.mlir(&mut stdout).map_err(|_err| VirdantError::Unknown)?; Ok(()) } - -pub fn check_module(input: &str) -> VirdantResult { - let mut db = Database::default(); - db.set_source(Arc::new(input.to_string())); - Ok(db.package_hir()?) -} - -#[test] -fn test_checker() { - let mut db = Database::default(); - db.set_source(Arc::new(" - public module Top { - incoming clk : Clock; - incoming in : Word[8]; - outgoing out : Word[8]; - reg r : Word[8] on clk <= in; - out := in->add(1w8); - submodule foo of Foo; - } - - module Foo { - wire w : Word[8] := 0; - } - ".to_string())); - - db.check().unwrap(); -} diff --git a/src/db/packageq.rs b/src/db/packageq.rs index f413e40..8370952 100644 --- a/src/db/packageq.rs +++ b/src/db/packageq.rs @@ -3,11 +3,14 @@ use crate::common::*; use super::TypecheckQ; use crate::hir; use crate::ast; +use crate::elab; #[salsa::query_group(PackageQStorage)] pub trait PackageQ: TypecheckQ { fn check_moddef(&self, moddef: Ident) -> VirdantResult<()>; fn check(&self) -> Result<(), VirdantError>; + fn elaborate(&self, moddef: Ident) -> VirdantResult; + fn package_hir(&self) -> VirdantResult; } @@ -49,6 +52,11 @@ fn check_moddef(db: &dyn PackageQ, moddef: Ident) -> VirdantResult<()> { errors.check() } +fn elaborate(db: &dyn PackageQ, moddef: Ident) -> VirdantResult { + let package = db.package_hir()?; + package.elab(moddef.into()) +} + fn package_hir(db: &dyn PackageQ) -> VirdantResult { db.check()?; let mut moddefs = HashMap::new(); diff --git a/src/db/structureq.rs b/src/db/structureq.rs index d04b01a..924b1b5 100644 --- a/src/db/structureq.rs +++ b/src/db/structureq.rs @@ -91,7 +91,7 @@ fn moddef_component_names(db: &dyn StructureQ, moddef: Ident) -> Result result.push(component.name.clone()), - ast::Decl::Submodule(submodule) => (), + ast::Decl::Submodule(_submodule) => (), ast::Decl::Connect(_connect) => (), } } diff --git a/src/db/typecheckq.rs b/src/db/typecheckq.rs index 03853ec..0105c40 100644 --- a/src/db/typecheckq.rs +++ b/src/db/typecheckq.rs @@ -10,9 +10,10 @@ use crate::ast; #[salsa::query_group(TypecheckQStorage)] pub trait TypecheckQ: StructureQ { fn moddef_context(&self, moddef: Ident) -> Result>, VirdantError>; + fn moddef_component_type(&self, moddef: Ident, component: Ident) -> Result; + fn moddef_hir_typed(&self, moddef: Ident) -> VirdantResult; fn typecheck_component(&self, moddef: Ident, component: Ident) -> VirdantResult; - fn moddef_component_type(&self, moddef: Ident, component: Ident) -> Result; fn moddef_component_hir_typed(&self, moddef: Ident, component: Ident) -> VirdantResult; } diff --git a/src/elab.rs b/src/elab.rs index 0eda037..d2ba40f 100644 --- a/src/elab.rs +++ b/src/elab.rs @@ -2,10 +2,8 @@ use std::collections::HashMap; use crate::common::*; use crate::hir; use crate::sim::{Sim, SimBuilder}; -use crate::types::Type; -use crate::context::Context; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct Elab { pub moddef: Arc, pub submodules: HashMap, diff --git a/src/hir.rs b/src/hir.rs index 4f35f97..ec21cd1 100644 --- a/src/hir.rs +++ b/src/hir.rs @@ -38,13 +38,6 @@ pub enum Component { Reg(Ident, Arc, Expr, /*Option,*/ Expr), } -#[derive(Debug, Clone, PartialEq, Eq)] -enum HirType { - Clock, - Word(Width), - Vec(Arc, usize), -} - #[derive(Debug, Clone, PartialEq, Eq)] pub struct InlineConnect(pub ConnectType, pub Expr); diff --git a/src/sim.rs b/src/sim.rs index db0aed2..6974321 100644 --- a/src/sim.rs +++ b/src/sim.rs @@ -376,9 +376,8 @@ pub fn simulator(input: &str, top: &str) -> VirdantResult { let mut db = Database::default(); db.set_source(Arc::new(input.to_string())); + let elaborated = db.elaborate(top.into())?; - let package = db.package_hir()?; - let elaborated = package.elab(top.into())?; let sim = elaborated.simulator(); Ok(sim) } diff --git a/src/tests.rs b/src/tests.rs index c2d791a..9cfaa05 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -4,13 +4,14 @@ use crate::context::Context; use crate::types::Type; use crate::parse::{parse_package, parse_expr}; use crate::ast; -use crate::db; +use crate::db::*; use crate::hir::*; #[test] fn test_examples() { let examples_dir = std::path::Path::new("examples"); let mut errors = vec![]; + let mut db = Database::default(); if let Ok(entries) = std::fs::read_dir(examples_dir) { for entry in entries { @@ -22,9 +23,10 @@ fn test_examples() { Ok(text) => text, Err(_) => panic!("Failed to read file {:?}", entry.path()), }; + db.set_source(Arc::new(text.to_string())); if let Err(_error) = std::panic::catch_unwind(|| { - db::check_module(&text).unwrap(); + db.check().unwrap(); }) { errors.push(filename.to_string()); } @@ -212,3 +214,24 @@ fn test_typecheck_exprs() { expr.eval(ctx); } } + +#[test] +fn test_checker() { + let mut db = Database::default(); + db.set_source(Arc::new(" + public module Top { + incoming clk : Clock; + incoming in : Word[8]; + outgoing out : Word[8]; + reg r : Word[8] on clk <= in; + out := in->add(1w8); + submodule foo of Foo; + } + + module Foo { + wire w : Word[8] := 0; + } + ".to_string())); + + db.check().unwrap(); +}