vast/v05/
ast.rs

1use crate::subset;
2use std::rc::Rc;
3
4pub type Id = subset::ast::Id;
5pub type Expr = subset::ast::Expr;
6pub type ExprConcat = subset::ast::ExprConcat;
7pub type EventTy = subset::ast::EventTy;
8pub type Attribute = subset::ast::Attribute;
9pub type AttributeTy = subset::ast::AttributeTy;
10pub type AssignTy = subset::ast::AssignTy;
11pub type Instance = subset::ast::Instance;
12pub type Stmt = subset::ast::GenericStmt<Decl, Parallel>;
13pub type Port = subset::ast::GenericPort<Decl>;
14pub type Module = subset::ast::GenericModule<Decl, Parallel>;
15pub type CaseBranch = subset::ast::GenericCaseBranch<Sequential>;
16pub type CaseDefault = subset::ast::GenericCaseDefault<Sequential>;
17pub type Case = subset::ast::GenericCase<Sequential>;
18
19#[derive(Clone, Debug, PartialEq, Eq, Hash)]
20pub enum Ty {
21    Int,
22    // maybe use nonzero64?
23    Width(u64),
24}
25
26#[derive(Clone, Debug, PartialEq, Eq, Hash)]
27pub enum Decl {
28    Int(Id, Ty),
29    Wire(Id, Ty),
30    Reg(Id, Ty),
31    Array(Id, Ty, Ty),
32    Param(Id, Expr),
33    AttributeDecl(Attribute, Rc<Decl>),
34}
35
36#[derive(Clone, Debug, Default)]
37pub struct SequentialIfElse {
38    pub cond: Option<Expr>,
39    pub body: Vec<Sequential>,
40    pub elsebr: Option<Rc<Sequential>>,
41}
42
43#[derive(Clone, Debug)]
44pub enum Sequential {
45    Wildcard,
46    Event(EventTy, Expr),
47    Assign(Expr, Expr, AssignTy),
48    IfElse(SequentialIfElse),
49    SeqCase(Case),
50}
51
52#[derive(Clone, Debug)]
53pub enum ProcessTy {
54    Always,
55}
56
57#[derive(Clone, Debug)]
58pub struct ParallelProcess {
59    pub ty: ProcessTy,
60    pub event: Option<Sequential>,
61    pub body: Vec<Sequential>,
62}
63
64#[derive(Clone, Debug)]
65pub enum Parallel {
66    Inst(Instance),
67    Assign(Expr, Expr),
68    Process(ParallelProcess),
69}