Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions crates/hir/src/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,18 @@ impl HirDisplay for InModule<PortHeader> {
}
InContainer::new((*module_id).into(), *ty).hir_fmt(f)
}
PortHeader::Interface { interface, modport } => {
if let Some(interface) = interface {
f.write_str(interface.as_str())?;
} else {
f.write_str("interface")?;
}
if let Some(modport) = modport {
f.write_str(".")?;
f.write_str(modport.as_str())?;
}
Ok(())
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions crates/hir/src/hir_def.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ pub mod expr;
pub mod file;
pub mod literal;
pub mod module;
pub mod package_import;
pub mod proc;
pub mod stmt;
pub mod subroutine;
Expand Down
6 changes: 6 additions & 0 deletions crates/hir/src/hir_def/block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ use super::{
timing_control::{EventExpr, EventExprSrc, impl_lower_event_expr},
},
lower_ident_opt,
package_import::{PackageImport, lower_package_imports},
stmt::{LowerStmt, Stmt, StmtId, StmtKind, StmtSrc, impl_lower_stmt},
typedef::{Typedef, TypedefId, TypedefSrc, lower_typedef_data_ty},
};
Expand All @@ -50,6 +51,7 @@ define_container! {
declarations: [Declaration],
typedefs: [Typedef],
structs: [StructDef],
package_imports: [PackageImport],
exprs: [Expr],
event_exprs: [EventExpr],
decls: [Declarator],
Expand Down Expand Up @@ -286,6 +288,10 @@ impl LowerBlockCtx<'_> {
self.declaration_ctx().lower_param_decl_base(it.parameter()).into()
},
ast::TypedefDeclaration[it] => self.lower_typedef(it).into(),
ast::PackageImportDeclaration[it] => {
lower_package_imports(it, &mut self.block.package_imports);
continue;
},
_ => continue,
};
self.block_source_map.items.push(idx);
Expand Down
7 changes: 7 additions & 0 deletions crates/hir/src/hir_def/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ use super::{
timing_control::{EventExpr, EventExprSrc, impl_lower_event_expr},
},
module::{LocalModuleId, ModuleInfo, ModuleSrc},
package_import::{PackageImport, lower_package_imports},
proc::{LowerProc, LowerProcCtx, Proc, ProcId, ProcSrc},
stmt::{Stmt, StmtId, StmtSrc, impl_lower_stmt},
subroutine::{
Expand Down Expand Up @@ -60,6 +61,7 @@ define_container! {
udp_decls: [UdpDecl],
library_decls: [LibraryDecl],
library_includes: [LibraryInclude],
package_imports: [PackageImport],
subroutines: [Subroutine],

declarations: [Declaration],
Expand Down Expand Up @@ -306,6 +308,11 @@ impl LowerFileCtx<'_> {
Some(id) => id.into(),
None => continue,
},
PackageImportDeclaration(import) => {
lower_package_imports(import, &mut self.file.package_imports);
self.region_tree.handle_node(member.syntax());
continue;
}
UdpDeclaration(udp_decl) => self.lower_udp_decl(udp_decl).into(),
ConfigDeclaration(config_decl) => self.lower_config_decl(config_decl).into(),
_ => continue,
Expand Down
55 changes: 50 additions & 5 deletions crates/hir/src/hir_def/module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use instantiation::{
ParamAssign, ParamAssignSrc, PortConn, PortConnSrc, impl_lower_instantiation,
};
use la_arena::{Arena, Idx, IdxRange, RawIdx};
use modport::{Modport, ModportId, ModportSrc, lower_modport_item};
use port::{
NonAnsiPort, NonAnsiPortId, NonAnsiPortSrc, PortDecl, PortDeclId, PortDeclSrc, PortRef,
PortRefId, PortRefSrc, PortSrcs, Ports,
Expand Down Expand Up @@ -41,6 +42,10 @@ use super::{
timing_control::{EventExpr, EventExprSrc, impl_lower_event_expr},
},
lower_ident_opt,
package_import::{
PackageExport, PackageImport, lower_package_export_all, lower_package_exports,
lower_package_imports,
},
proc::{LowerProc, LowerProcCtx, Proc, ProcId, ProcSrc},
stmt::{Stmt, StmtId, StmtSrc, impl_lower_stmt},
subroutine::{
Expand All @@ -63,6 +68,7 @@ pub mod continuous_assgin;
pub mod defparam;
pub mod generate;
pub mod instantiation;
pub mod modport;
pub mod port;
pub mod specify;

Expand All @@ -83,9 +89,12 @@ define_container! {
generate_regions: [GenerateRegion],
specify_blocks: [SpecifyBlock],
specify_items: [SpecifyItem],
modports: [Modport],
declarations: [Declaration],
typedefs: [Typedef],
structs: [StructDef],
package_imports: [PackageImport],
package_exports: [PackageExport],
subroutines: [Subroutine],

instantiations: [Instantiation],
Expand Down Expand Up @@ -122,6 +131,7 @@ define_container! {
generate_region_srcs: [GenerateRegion | GenerateRegionSrc],
specify_block_srcs: [SpecifyBlock | SpecifyBlockSrc],
specify_item_srcs: [SpecifyItem | SpecifyItemSrc],
modport_srcs: [Modport | ModportSrc],
declaration_srcs: [Declaration | DeclarationSrc],
typedef_srcs: [Typedef | TypedefSrc],
struct_srcs: [StructDef | StructSrc],
Expand Down Expand Up @@ -174,6 +184,7 @@ impl ModuleSourceMap {
ModuleItem::GenerateRegionId(idx) => self.get(*idx)?.into(),
ModuleItem::SpecifyBlockId(idx) => self.get(*idx)?.0,
ModuleItem::SpecifyItemId(idx) => self.get(*idx)?.into(),
ModuleItem::ModportId(idx) => self.get(*idx)?.node,
ModuleItem::DeclarationId(idx) => self.get(*idx)?.ptr(),
ModuleItem::StructId(idx) => self.get(*idx)?.node,
ModuleItem::InstantiationId(idx) => self.get(*idx)?.into(),
Expand All @@ -193,6 +204,7 @@ define_enum_deriving_from! {
GenerateRegionId(GenerateRegionId),
SpecifyBlockId(SpecifyBlockId),
SpecifyItemId(SpecifyItemId),
ModportId(ModportId),
DeclarationId(DeclarationId),
StructId(StructId),
InstantiationId(InstantiationId),
Expand Down Expand Up @@ -257,6 +269,18 @@ impl LowerProc for LowerModuleCtx<'_> {
}

impl LowerModuleCtx<'_> {
fn lower_modport_decl(&mut self, decl: ast::ModportDeclaration) -> Vec<ModportId> {
decl.items()
.children()
.map(|item| {
alloc_idx_and_src! {
lower_modport_item(item) => self.module.modports,
item => self.module_source_map.modport_srcs,
}
})
.collect()
}

fn lower_struct_type(&mut self, struct_ty: ast::StructUnionType) -> StructId {
let container_id = ContainerId::ModuleId(self.module_id);
let struct_def =
Expand Down Expand Up @@ -403,7 +427,11 @@ impl LowerModuleCtx<'_> {
ExplicitAnsiPort(_) | ImplicitAnsiPort(_) => continue,

// Imports
PackageImportDeclaration(_) => continue,
PackageImportDeclaration(import) => {
lower_package_imports(import, &mut self.module.package_imports);
self.region_tree.handle_node(member.syntax());
continue;
}

// Aggregates
ClassDeclaration(_) => continue,
Expand Down Expand Up @@ -469,10 +497,18 @@ impl LowerModuleCtx<'_> {
NetAlias(_) => continue,

// Modport
ModportDeclaration(_)
| ModportClockingPort(_)
ModportDeclaration(decl) => {
for modport_id in self.lower_modport_decl(decl) {
self.module_source_map.items.push(modport_id.into());
}
self.region_tree.handle_node(member.syntax());
continue;
}
ModportClockingPort(_)
| ModportSimplePortList(_)
| ModportSubroutinePortList(_) => continue,
| ModportSubroutinePortList(_) => {
continue;
}

// Class members (shouldn't appear in module but handle anyway)
ClassPropertyDeclaration(_)
Expand All @@ -492,7 +528,16 @@ impl LowerModuleCtx<'_> {
BindDirective(_) => continue,

// Package exports
PackageExportDeclaration(_) | PackageExportAllDeclaration(_) => continue,
PackageExportDeclaration(export) => {
lower_package_exports(export, &mut self.module.package_exports);
self.region_tree.handle_node(member.syntax());
continue;
}
PackageExportAllDeclaration(export) => {
lower_package_export_all(export, &mut self.module.package_exports);
self.region_tree.handle_node(member.syntax());
continue;
}

// Library
LibraryDeclaration(_) | LibraryIncludeStatement(_) => continue,
Expand Down
9 changes: 9 additions & 0 deletions crates/hir/src/hir_def/module/generate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ use crate::{
timing_control::{EventExpr, EventExprSrc, impl_lower_event_expr},
},
lower_ident_opt,
package_import::{PackageImport, lower_package_imports},
proc::{LowerProc, LowerProcCtx, Proc, ProcId, ProcSrc},
stmt::{Stmt, StmtId, StmtSrc, impl_lower_stmt},
subroutine::{
Expand Down Expand Up @@ -299,6 +300,7 @@ define_container! {
declarations: [Declaration],
typedefs: [Typedef],
structs: [StructDef],
package_imports: [PackageImport],
subroutines: [Subroutine],

instantiations: [Instantiation],
Expand Down Expand Up @@ -618,6 +620,10 @@ impl LowerGenerateBlockCtx<'_> {
self.instantiation_ctx().lower_primitive_instantiation(instantiation).into()
}
FunctionDeclaration(fn_decl) => self.lower_subroutine_decl(fn_decl)?.into(),
PackageImportDeclaration(import) => {
lower_package_imports(import, &mut self.generate_block.package_imports);
return None;
}
ProceduralBlock(proc) => self.proc_ctx().lower_proc(proc).into(),
GenerateBlock(block) => {
self.intern_generate_block(GenerateBlockSrc::from_generate_block(block)).into()
Expand Down Expand Up @@ -821,6 +827,9 @@ impl LowerModuleCtx<'_> {
items.push(sub_id.into());
}
}
PackageImportDeclaration(import) => {
lower_package_imports(import, &mut self.module.package_imports);
}
ProceduralBlock(proc) => {
items.push(self.proc_ctx().lower_proc(proc).into());
}
Expand Down
75 changes: 75 additions & 0 deletions crates/hir/src/hir_def/module/modport.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
use la_arena::Idx;
use syntax::{
SyntaxKind, TokenKind,
ast::{self, AstNode},
ptr::{SyntaxNodePtr, SyntaxTokenPtr},
slang_ext::AstNodeExt,
};
use utils::text_edit::TextRange;

use crate::{
hir_def::{Ident, lower_ident_opt},
source_map::{FromSourceAst, IsNamedSrc, IsSrc, SourceAst, ToAstNode, root_token_in},
};

#[derive(Debug, PartialEq, Eq, Clone, Hash)]
pub struct Modport {
pub name: Option<Ident>,
}

pub type ModportId = Idx<Modport>;

#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct ModportSrc {
pub node: SyntaxNodePtr,
pub name: Option<SyntaxTokenPtr>,
}

impl IsSrc for ModportSrc {
fn kind(&self) -> SyntaxKind {
self.node.kind()
}

fn range(&self) -> TextRange {
self.node.range()
}
}

impl IsNamedSrc for ModportSrc {
fn name_kind(&self) -> Option<TokenKind> {
self.name.map(|name| name.kind())
}

fn name_range(&self) -> Option<TextRange> {
self.name.map(|name| name.range())
}
}

impl<'a> ToAstNode<'a, ast::ModportItem<'a>> for ModportSrc {
fn to_node(&self, tree: &'a syntax::SyntaxTree) -> Option<ast::ModportItem<'a>> {
ast::ModportItem::cast(self.node.to_node(tree)?)
}
}

impl From<ast::ModportItem<'_>> for ModportSrc {
fn from(node: ast::ModportItem<'_>) -> Self {
let syntax = node.syntax();
let name = node.name().map(|name| SyntaxTokenPtr::from_token_in(syntax, name));
ModportSrc { node: AstNodeExt::to_ptr(&node), name }
}
}

impl<'a> FromSourceAst<'a, ast::ModportItem<'a>> for ModportSrc {
fn from_source_ast(node: SourceAst<ast::ModportItem<'a>>) -> Self {
let node = node.into_inner();
let syntax = node.syntax();
let name = node
.name()
.and_then(|name| root_token_in(syntax, name).map(SyntaxTokenPtr::from_token));
ModportSrc { node: AstNodeExt::to_ptr(&node), name }
}
}

pub(crate) fn lower_modport_item(item: ast::ModportItem) -> Modport {
Modport { name: lower_ident_opt(item.name()) }
}
Loading
Loading