Skip to content

Commit

Permalink
Merge pull request #667 from veryl-lang/add_owned_to_type_dag
Browse files Browse the repository at this point in the history
Fix filelist order related to package items
  • Loading branch information
dalance authored Apr 15, 2024
2 parents b4b32ea + 5a42f24 commit 5f5097c
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 17 deletions.
93 changes: 77 additions & 16 deletions crates/analyzer/src/handlers/create_type_dag.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ use crate::{
symbol_table::SymbolPathNamespace,
type_dag::{self, Context, DagError},
};
use std::collections::HashMap;
use veryl_parser::{
resource_table,
veryl_grammar_trait::{
DescriptionItem, EnumDeclaration, InterfaceDeclaration, ModuleDeclaration,
PackageDeclaration, ScopedIdentifier, StructUnion, StructUnionDeclaration,
TypeDefDeclaration, Veryl, VerylGrammarTrait,
DescriptionItem, EnumDeclaration, InterfaceDeclaration, LocalDeclaration,
ModportDeclaration, ModuleDeclaration, PackageDeclaration, ScopedIdentifier, StructUnion,
StructUnionDeclaration, TypeDefDeclaration, Veryl, VerylGrammarTrait,
},
veryl_token::Token,
ParolError,
Expand All @@ -26,6 +27,7 @@ pub struct CreateTypeDag<'a> {
point: HandlerPoint,
ctx: Vec<Context>,
file_scope_import: Vec<Option<u32>>,
owned: HashMap<u32, Vec<u32>>,
}

impl<'a> CreateTypeDag<'a> {
Expand Down Expand Up @@ -80,6 +82,21 @@ impl<'a> CreateTypeDag<'a> {
}
}
}

fn insert_owned(&mut self, parent: u32, child: u32) {
self.owned
.entry(parent)
.and_modify(|x| x.push(child))
.or_insert(vec![child]);
}

fn is_owned(&self, parent: u32, child: u32) -> bool {
if let Some(owned) = self.owned.get(&parent) {
owned.contains(&child)
} else {
false
}
}
}

impl<'a> Handler for CreateTypeDag<'a> {
Expand All @@ -96,6 +113,10 @@ impl<'a> VerylGrammarTrait for CreateTypeDag<'a> {
let name = arg.identifier.identifier_token.to_string();
let token = arg.identifier.identifier_token.token;
if let Some(x) = self.insert_node(&path, &name, &token) {
if let Some(parent) = self.parent.last().cloned() {
self.insert_edge(x, parent, *self.ctx.last().unwrap());
self.insert_owned(parent, x);
}
self.parent.push(x)
}
// Unused for now, but will be useful in the future
Expand All @@ -113,20 +134,31 @@ impl<'a> VerylGrammarTrait for CreateTypeDag<'a> {
Ok(())
}

fn type_def_declaration(&mut self, arg: &TypeDefDeclaration) -> Result<(), ParolError> {
match self.point {
HandlerPoint::Before => {
let path: SymbolPathNamespace = arg.identifier.as_ref().into();
let name = arg.identifier.identifier_token.to_string();
let token = arg.identifier.identifier_token.token;
if let Some(x) = self.insert_node(&path, &name, &token) {
self.parent.push(x)
fn local_declaration(&mut self, arg: &LocalDeclaration) -> Result<(), ParolError> {
if let HandlerPoint::Before = self.point {
let path: SymbolPathNamespace = arg.identifier.as_ref().into();
let name = arg.identifier.identifier_token.to_string();
let token = arg.identifier.identifier_token.token;
if let Some(x) = self.insert_node(&path, &name, &token) {
if let Some(parent) = self.parent.last().cloned() {
self.insert_edge(x, parent, *self.ctx.last().unwrap());
self.insert_owned(parent, x);
}
self.ctx.push(Context::TypeDef);
}
HandlerPoint::After => {
self.parent.pop();
self.ctx.pop();
}
Ok(())
}

fn type_def_declaration(&mut self, arg: &TypeDefDeclaration) -> Result<(), ParolError> {
if let HandlerPoint::Before = self.point {
let path: SymbolPathNamespace = arg.identifier.as_ref().into();
let name = arg.identifier.identifier_token.to_string();
let token = arg.identifier.identifier_token.token;
if let Some(x) = self.insert_node(&path, &name, &token) {
if let Some(parent) = self.parent.last().cloned() {
self.insert_edge(x, parent, *self.ctx.last().unwrap());
self.insert_owned(parent, x);
}
}
}
Ok(())
Expand All @@ -140,8 +172,33 @@ impl<'a> VerylGrammarTrait for CreateTypeDag<'a> {
let token = arg.identifier().token;
let child = self.insert_node(&path, &name, &token);
if let (Some(parent), Some(child)) = (self.parent.last(), child) {
self.insert_edge(*parent, child, *self.ctx.last().unwrap());
if !self.is_owned(*parent, child) {
self.insert_edge(*parent, child, *self.ctx.last().unwrap());
}
}
}
}
Ok(())
}

fn modport_declaration(&mut self, arg: &ModportDeclaration) -> Result<(), ParolError> {
match self.point {
HandlerPoint::Before => {
let path: SymbolPathNamespace = arg.identifier.as_ref().into();
let name = arg.identifier.identifier_token.to_string();
let token = arg.identifier.identifier_token.token;
if let Some(x) = self.insert_node(&path, &name, &token) {
if let Some(parent) = self.parent.last().cloned() {
self.insert_edge(x, parent, *self.ctx.last().unwrap());
self.insert_owned(parent, x);
}
self.parent.push(x)
}
self.ctx.push(Context::Modport);
}
HandlerPoint::After => {
self.parent.pop();
self.ctx.pop();
}
}
Ok(())
Expand All @@ -154,6 +211,10 @@ impl<'a> VerylGrammarTrait for CreateTypeDag<'a> {
let name = arg.identifier.identifier_token.to_string();
let token = arg.identifier.identifier_token.token;
if let Some(x) = self.insert_node(&path, &name, &token) {
if let Some(parent) = self.parent.last().cloned() {
self.insert_edge(x, parent, *self.ctx.last().unwrap());
self.insert_owned(parent, x);
}
self.parent.push(x)
}
self.ctx.push(Context::Enum);
Expand Down
3 changes: 2 additions & 1 deletion crates/analyzer/src/type_dag.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ pub enum Context {
Module,
Interface,
Package,
Modport,
}

#[derive(Debug, Clone)]
Expand Down Expand Up @@ -134,7 +135,7 @@ impl TypeDag {
let mut ret = "".to_string();
for node in nodes {
if let Some(path) = self.paths.get(&(node.index() as u32)) {
ret.push_str(&format!("{}\n", path.name,));
ret.push_str(&format!("{}\n", path.name));
let mut set = HashSet::new();
for parent in self.dag.parents(node).iter(&self.dag) {
let node = parent.1.index() as u32;
Expand Down

0 comments on commit 5f5097c

Please sign in to comment.