Update cst::AlwaysStatement
This commit is contained in:
parent
dda95883e4
commit
d3c4fbc626
|
@ -1,15 +1,39 @@
|
|||
use crate::cst::ModuleContext;
|
||||
use crate::cst::{ModuleContext, ProceduralTimingControlStatement, Tag, Tools};
|
||||
use json::JsonValue;
|
||||
use llhd::ir::{Signature, Unit, UnitBuilder, UnitData, UnitKind, UnitName};
|
||||
|
||||
pub struct AlwaysStatement {}
|
||||
|
||||
impl AlwaysStatement {
|
||||
pub fn codegen<'a>(_json: &JsonValue, context: &'a mut ModuleContext) -> Unit<'a> {
|
||||
let mut proc_data =
|
||||
UnitData::new(UnitKind::Process, UnitName::Anonymous(0), Signature::new());
|
||||
pub fn codegen<'a>(json: &JsonValue, context: &'a mut ModuleContext) -> Unit<'a> {
|
||||
let mut proc_data = UnitData::new(
|
||||
UnitKind::Process,
|
||||
UnitName::local(format!("{}.always.{}", context.name, context.process.len())),
|
||||
Signature::new(),
|
||||
);
|
||||
let mut _proc_builder = UnitBuilder::new_anonymous(&mut proc_data);
|
||||
let proc_id = context.module.add_unit(proc_data);
|
||||
context.process.push(proc_id);
|
||||
|
||||
match json["children"][0]["tag"].as_str() {
|
||||
Some(Tag::ALWAYS) => {
|
||||
let json_statement = Tools::match_tags(
|
||||
vec![json],
|
||||
vec![
|
||||
Tag::ALWAYS_STATEMENT,
|
||||
Tag::PROCEDURAL_TIMING_CONTROL_STATEMENT,
|
||||
],
|
||||
);
|
||||
assert_eq!(json_statement.len(), 1);
|
||||
ProceduralTimingControlStatement::codegen(json_statement[0], context);
|
||||
}
|
||||
Some(Tag::ALWAYS_COMB) => {
|
||||
// TODO
|
||||
}
|
||||
_ => {
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
|
||||
context.module.unit(proc_id)
|
||||
}
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
use llhd::ir::{Arg, Module};
|
||||
use llhd::ir::{Arg, Module, UnitId};
|
||||
use std::collections::HashMap;
|
||||
|
||||
pub struct ModuleContext {
|
||||
pub name: String,
|
||||
pub module: Module,
|
||||
pub arg_info: HashMap<Arg, ArgInfo>,
|
||||
pub process: Vec<UnitId>,
|
||||
}
|
||||
|
||||
pub struct ArgInfo {
|
||||
|
@ -14,8 +16,10 @@ pub struct ArgInfo {
|
|||
impl ModuleContext {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
name: String::new(),
|
||||
module: Module::new(),
|
||||
arg_info: HashMap::new(),
|
||||
process: Vec::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,13 +1,15 @@
|
|||
pub mod always_statement;
|
||||
pub mod context;
|
||||
pub mod description_list;
|
||||
pub mod module_declaration;
|
||||
pub mod tags;
|
||||
pub mod tools;
|
||||
mod always_statement;
|
||||
mod context;
|
||||
mod description_list;
|
||||
mod module_declaration;
|
||||
mod procedural_timing_control_statement;
|
||||
mod tags;
|
||||
mod tools;
|
||||
|
||||
pub use always_statement::AlwaysStatement;
|
||||
pub use context::{ArgInfo, ModuleContext};
|
||||
use always_statement::AlwaysStatement;
|
||||
use context::{ArgInfo, ModuleContext};
|
||||
pub use description_list::DescriptionList;
|
||||
pub use module_declaration::ModuleDeclaration;
|
||||
use module_declaration::ModuleDeclaration;
|
||||
use procedural_timing_control_statement::ProceduralTimingControlStatement;
|
||||
pub use tags::Tag;
|
||||
pub use tools::Tools;
|
||||
use tools::Tools;
|
||||
|
|
|
@ -4,7 +4,6 @@ use llhd::ir::{
|
|||
ExtUnit, InstBuilder, Module, Signature, UnitBuilder, UnitData, UnitKind, UnitName,
|
||||
};
|
||||
use llhd::ty::{int_ty, signal_ty};
|
||||
use std::collections::HashMap;
|
||||
|
||||
pub struct ModuleDeclaration {}
|
||||
|
||||
|
@ -12,51 +11,15 @@ impl ModuleDeclaration {
|
|||
pub fn codegen(json: &JsonValue) -> Module {
|
||||
let mut context = ModuleContext::new();
|
||||
|
||||
let entity_name = UnitName::global({
|
||||
let json_symbol_identifier = Tools::match_tags(
|
||||
vec![json],
|
||||
vec![
|
||||
Tag::MODULE_DECLARATION,
|
||||
Tag::MODULE_HEADER,
|
||||
Tag::SYMBOL_IDENTIFIER,
|
||||
],
|
||||
);
|
||||
assert_eq!(json_symbol_identifier.len(), 1);
|
||||
json_symbol_identifier[0]["text"].to_string()
|
||||
});
|
||||
|
||||
let mut entity_signature = Signature::new();
|
||||
|
||||
let json_ports = &Tools::match_tags(
|
||||
vec![json],
|
||||
vec![
|
||||
Tag::MODULE_DECLARATION,
|
||||
Tag::MODULE_ITEM_LIST,
|
||||
Tag::MODULE_PORT_DECLARATION,
|
||||
],
|
||||
);
|
||||
|
||||
let input_info = &Self::get_port_info(json_ports, Tag::INPUT);
|
||||
let output_info = &Self::get_port_info(json_ports, Tag::OUTPUT);
|
||||
|
||||
let mut arg_table = HashMap::new();
|
||||
for (name, width) in input_info {
|
||||
let arg = entity_signature.add_input(signal_ty(int_ty(width.clone())));
|
||||
arg_table.insert(arg, name.to_string());
|
||||
context.arg_info.insert(arg, ArgInfo::new(name, width));
|
||||
}
|
||||
for (name, width) in output_info {
|
||||
let arg = entity_signature.add_output(signal_ty(int_ty(width.clone())));
|
||||
arg_table.insert(arg, name.to_string());
|
||||
context.arg_info.insert(arg, ArgInfo::new(name, width));
|
||||
}
|
||||
|
||||
let entity_name = Self::get_entity_name(json, &mut context);
|
||||
let entity_signature = Self::get_entity_signature(json, &mut context);
|
||||
let mut entity_data = UnitData::new(UnitKind::Entity, entity_name, entity_signature);
|
||||
|
||||
let mut entity_builder = UnitBuilder::new_anonymous(&mut entity_data);
|
||||
|
||||
for (arg, name) in arg_table.iter() {
|
||||
for (arg, arg_info) in context.arg_info.iter() {
|
||||
let value = entity_builder.arg_value(*arg);
|
||||
entity_builder.set_name(value, name.to_string());
|
||||
entity_builder.set_name(value, arg_info.name.to_string());
|
||||
}
|
||||
|
||||
let process_list: Vec<ExtUnit> = Tools::match_tags(
|
||||
|
@ -85,6 +48,50 @@ impl ModuleDeclaration {
|
|||
context.module
|
||||
}
|
||||
|
||||
fn get_entity_name(json: &JsonValue, context: &mut ModuleContext) -> UnitName {
|
||||
context.name = {
|
||||
let json_symbol_identifier = Tools::match_tags(
|
||||
vec![json],
|
||||
vec![
|
||||
Tag::MODULE_DECLARATION,
|
||||
Tag::MODULE_HEADER,
|
||||
Tag::SYMBOL_IDENTIFIER,
|
||||
],
|
||||
);
|
||||
assert_eq!(json_symbol_identifier.len(), 1);
|
||||
json_symbol_identifier[0]["text"].to_string()
|
||||
};
|
||||
|
||||
UnitName::global(context.name.to_string())
|
||||
}
|
||||
|
||||
fn get_entity_signature(json: &JsonValue, context: &mut ModuleContext) -> Signature {
|
||||
let mut signature = Signature::new();
|
||||
|
||||
let json_ports = &Tools::match_tags(
|
||||
vec![json],
|
||||
vec![
|
||||
Tag::MODULE_DECLARATION,
|
||||
Tag::MODULE_ITEM_LIST,
|
||||
Tag::MODULE_PORT_DECLARATION,
|
||||
],
|
||||
);
|
||||
|
||||
let input_info = &Self::get_port_info(json_ports, Tag::INPUT);
|
||||
let output_info = &Self::get_port_info(json_ports, Tag::OUTPUT);
|
||||
|
||||
for (name, width) in input_info {
|
||||
let arg = signature.add_input(signal_ty(int_ty(width.clone())));
|
||||
context.arg_info.insert(arg, ArgInfo::new(name, width));
|
||||
}
|
||||
for (name, width) in output_info {
|
||||
let arg = signature.add_output(signal_ty(int_ty(width.clone())));
|
||||
context.arg_info.insert(arg, ArgInfo::new(name, width));
|
||||
}
|
||||
|
||||
signature
|
||||
}
|
||||
|
||||
fn get_bit_names(json_io_ports: &Vec<&JsonValue>) -> Vec<String> {
|
||||
// note: possible improvement by merging common path segments
|
||||
let paths = vec![
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
use crate::cst::ModuleContext;
|
||||
use json::JsonValue;
|
||||
|
||||
pub struct ProceduralTimingControlStatement {}
|
||||
|
||||
impl ProceduralTimingControlStatement {
|
||||
pub fn codegen(_json: &JsonValue, _context: &ModuleContext) {}
|
||||
}
|
|
@ -4,11 +4,8 @@ impl Tag {
|
|||
pub const DESCRIPTION_LIST: &'static str = "kDescriptionList";
|
||||
pub const MODULE_DECLARATION: &'static str = "kModuleDeclaration";
|
||||
pub const MODULE_HEADER: &'static str = "kModuleHeader";
|
||||
pub const SYMBOL_IDENTIFIER: &'static str = "SymbolIdentifier";
|
||||
pub const MODULE_ITEM_LIST: &'static str = "kModuleItemList";
|
||||
pub const MODULE_PORT_DECLARATION: &'static str = "kModulePortDeclaration";
|
||||
pub const INPUT: &'static str = "input";
|
||||
pub const OUTPUT: &'static str = "output";
|
||||
pub const PORT_IDENTIFIER_LIST: &'static str = "kPortIdentifierList";
|
||||
pub const PORT_IDENTIFIER: &'static str = "kPortIdentifier";
|
||||
pub const IDENTIFIER_LIST: &'static str = "kIdentifierList";
|
||||
|
@ -21,6 +18,15 @@ impl Tag {
|
|||
pub const DIMENSION_RANGE: &'static str = "kDimensionRange";
|
||||
pub const EXPRESSION: &'static str = "kExpression";
|
||||
pub const NUMBER: &'static str = "kNumber";
|
||||
pub const DEC_NUMBER: &'static str = "TK_DecNumber";
|
||||
pub const ALWAYS_STATEMENT: &'static str = "kAlwaysStatement";
|
||||
pub const PROCEDURAL_TIMING_CONTROL_STATEMENT: &'static str =
|
||||
"kProceduralTimingControlStatement";
|
||||
|
||||
pub const SYMBOL_IDENTIFIER: &'static str = "SymbolIdentifier";
|
||||
pub const DEC_NUMBER: &'static str = "TK_DecNumber";
|
||||
|
||||
pub const INPUT: &'static str = "input";
|
||||
pub const OUTPUT: &'static str = "output";
|
||||
pub const ALWAYS: &'static str = "always";
|
||||
pub const ALWAYS_COMB: &'static str = "always_comb";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue