use std::collections::HashMap;
pub use moore_common::name::Name;
pub use moore_common::source::Span;
pub use moore_svlog_syntax::ast::NodeId;
use moore_svlog_syntax::ast;
pub struct Root {
pub top: NodeId,
pub mods: HashMap<NodeId, Module>,
pub intfs: HashMap<NodeId, Interface>,
pub pkgs: HashMap<NodeId, Package>,
}
pub struct NodeIndex<'hir> {
pub hir: &'hir Root,
pub nodes: HashMap<NodeId, Node<'hir>>,
}
#[derive(Copy, Clone)]
pub enum Node<'hir> {
Module(&'hir Module),
Interface(&'hir Interface),
Package(&'hir Package),
Port(&'hir Port),
PortSlice(&'hir PortSlice),
TypeParam(&'hir ast::ParamTypeDecl),
ValueParam(&'hir ast::ParamValueDecl),
VarDecl(&'hir ast::VarDecl, &'hir ast::VarDeclName),
}
pub struct Module {
pub id: NodeId,
pub name: Name,
pub span: Span,
pub lifetime: ast::Lifetime,
pub ports: Vec<Port>,
pub params: Vec<ast::ParamDecl>,
pub body: HierarchyBody,
}
pub struct Interface {
pub id: NodeId,
pub name: Name,
pub span: Span,
pub lifetime: ast::Lifetime,
pub ports: Vec<Port>,
pub params: Vec<ast::ParamDecl>,
pub body: HierarchyBody,
}
pub struct Package {
pub name: Name,
pub span: Span,
pub lifetime: ast::Lifetime,
pub body: HierarchyBody,
}
pub struct HierarchyBody {
pub procs: Vec<ast::Procedure>,
pub nets: Vec<ast::NetDecl>,
pub vars: Vec<ast::VarDecl>,
pub assigns: Vec<ast::ContAssign>,
pub params: Vec<ast::ParamDecl>,
pub insts: Vec<ast::Inst>,
pub genreg: Vec<HierarchyBody>,
pub genvars: Vec<ast::GenvarDecl>,
pub genfors: Vec<GenerateFor>,
pub genifs: Vec<GenerateIf>,
pub gencases: Vec<ast::GenerateCase>,
pub classes: Vec<ast::ClassDecl>, pub subroutines: Vec<ast::SubroutineDecl>, pub asserts: Vec<ast::Assertion>,
pub typedefs: Vec<ast::Typedef>,
}
#[derive(Debug)]
pub struct Port {
pub name: Option<Name>,
pub span: Span,
pub slices: Vec<PortSlice>,
}
#[derive(Debug)]
pub struct PortSlice {
pub id: NodeId,
pub name: Name,
pub span: Span,
pub selects: Vec<PortSelect>,
pub dir: ast::PortDir,
pub kind: ast::PortKind,
pub ty: Option<ast::Type>,
pub dims: Vec<ast::TypeDim>,
}
#[derive(Debug)]
pub enum PortSelect {
Member(Span, Name),
Index(Span, Expr),
}
pub struct PortDecl {
pub dir: ast::PortDir,
}
#[derive(Debug)]
pub struct Expr;
pub struct GenerateBlock {
pub span: Span,
pub label: Option<Name>,
pub body: HierarchyBody,
}
pub struct GenerateFor {
pub span: Span,
pub init: ast::Stmt,
pub cond: ast::Expr,
pub step: ast::Expr,
pub block: GenerateBlock,
}
pub struct GenerateIf {
pub span: Span,
pub cond: ast::Expr,
pub main_block: GenerateBlock,
pub else_block: Option<GenerateBlock>,
}