Skip to content

Commit 102e59b

Browse files
introduce $prop namespace
(refs: #3111)
1 parent 2c4b416 commit 102e59b

14 files changed

Lines changed: 71 additions & 43 deletions

File tree

Veryl.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,19 @@ revision = "52fc06237c5b70d42d67ea0910874ba111a6ef98"
4545
[projects.properties]
4646

4747
[[projects]]
48-
name = "veryl_sample4"
48+
name = "veryl_sample5"
4949
source = "testcases/sample"
5050
dependencies = []
5151

5252
[projects.properties]
53-
QUX_0_VALUE = 16
54-
QUX_1_VALUE = false
53+
QUX_0 = 32
54+
QUX_1 = true
5555

5656
[[projects]]
57-
name = "veryl_sample5"
57+
name = "veryl_sample4"
5858
source = "testcases/sample"
5959
dependencies = []
6060

6161
[projects.properties]
62-
QUX_0_VALUE = 32
63-
QUX_1_VALUE = true
62+
QUX_0 = 16
63+
QUX_1 = false

Veryl.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@ compile_args = ["-full64"]
3131
veryl_sample = {version = "0.16.0", github = "veryl-lang/sample"}
3232
veryl_sample2 = {version = "0.17.0", project = "veryl_sample", github = "veryl-lang/sample"}
3333
veryl_sample3 = {version = "0.18.0", project = "veryl_sample", git = "https://github.com/veryl-lang/sample"}
34-
veryl_sample4 = {path = "testcases/sample", properties = {QUX_0_VALUE = 16}}
35-
veryl_sample5 = {path = "testcases/sample", properties = {QUX_1_VALUE = true}}
34+
veryl_sample4 = {path = "testcases/sample", properties = {QUX_0 = 16}}
35+
veryl_sample5 = {path = "testcases/sample", properties = {QUX_1 = true}}

crates/analyzer/src/analyzer.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ fn insert_namespace_symbol(name: &str, public: bool) -> StrId {
7777
}
7878

7979
fn insert_project_property_symbols(
80-
prject_name: StrId,
80+
project_name: StrId,
8181
properties: &BTreeMap<String, ProjectProperty>,
8282
) {
83-
let mut namespace = Namespace::new();
84-
namespace.push(prject_name);
83+
let prop_symbol = create_prop_namespace_symbol(project_name);
8584

85+
let namespace = prop_symbol.inner_namespace();
8686
for (prop_name, prop_value) in properties {
8787
let token = Token::from_external_text(prop_name);
8888
let value_property = ProjectPropertyValueProperty::new(prop_value, token.into());
@@ -97,6 +97,23 @@ fn insert_project_property_symbols(
9797
}
9898
}
9999

100+
fn create_prop_namespace_symbol(project_name: StrId) -> Symbol {
101+
let mut namespace = Namespace::new();
102+
namespace.push(project_name);
103+
104+
let token = Token::builtin_text("$prop");
105+
let symbol = Symbol::new(
106+
&token,
107+
SymbolKind::PropNamesapce,
108+
&namespace,
109+
false,
110+
DocComment::default(),
111+
);
112+
symbol_table::insert(&token, symbol.clone());
113+
114+
symbol
115+
}
116+
100117
impl Analyzer {
101118
pub fn new(metadata: &Metadata) -> Self {
102119
let prj = insert_namespace_symbol(&metadata.project.name, true);

crates/analyzer/src/sv_system_function.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::symbol::{
55
};
66
use crate::symbol_table::SymbolTable;
77
use veryl_parser::token_range::TokenRange;
8-
use veryl_parser::veryl_token::{Token, TokenSource, VerylToken};
8+
use veryl_parser::veryl_token::{Token, VerylToken};
99

1010
pub struct SvSystemFunction {
1111
pub name: String,
@@ -28,12 +28,12 @@ pub fn insert_symbols(symbol_table: &mut SymbolTable, namespace: &Namespace) {
2828
let mut namespace = namespace.clone();
2929

3030
for func in sv_system_functions() {
31-
let token = Token::new(&func.name, 0, 0, 0, 0, TokenSource::Builtin);
31+
let token = Token::builtin_text(&func.name);
3232
let mut ports = Vec::new();
3333

3434
namespace.push(token.text);
3535
for (name, direction) in &func.ports {
36-
let token = Token::new(name, 0, 0, 0, 0, TokenSource::Builtin);
36+
let token = Token::builtin_text(name);
3737
let r#type = Type {
3838
modifier: vec![],
3939
kind: TypeKind::Any,

crates/analyzer/src/symbol.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,7 @@ pub enum SymbolKind {
10471047
Embed,
10481048
TbComponent(TbComponentProperty),
10491049
ProjectProperty(ProjectPropertyValueProperty),
1050+
PropNamesapce,
10501051
}
10511052

10521053
impl SymbolKind {
@@ -1141,6 +1142,7 @@ impl SymbolKind {
11411142
SymbolKind::Embed => "embed".to_string(),
11421143
SymbolKind::TbComponent(x) => format!("testbench {}", x.kind),
11431144
SymbolKind::ProjectProperty(_) => "project property".to_string(),
1145+
SymbolKind::PropNamesapce => "$prop namespace".to_string(),
11441146
}
11451147
}
11461148

@@ -1445,6 +1447,7 @@ impl fmt::Display for SymbolKind {
14451447
x.value.value_string()
14461448
)
14471449
}
1450+
SymbolKind::PropNamesapce => "$prop namespace".to_string(),
14481451
};
14491452
text.fmt(f)
14501453
}

crates/analyzer/src/symbol_table.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ impl SymbolTable {
205205
let namespace = Namespace::new();
206206

207207
for func in DEFINED_NAMESPACES {
208-
let token = Token::new(func, 0, 0, 0, 0, TokenSource::Builtin);
208+
let token = Token::builtin_text(func);
209209
let symbol = Symbol::new(
210210
&token,
211211
SymbolKind::Namespace,
@@ -688,7 +688,7 @@ impl SymbolTable {
688688
SymbolKind::AliasPackage(x) => {
689689
context = self.trace_type_path(context, &x.target)?;
690690
}
691-
SymbolKind::Enum(_) | SymbolKind::Namespace => {
691+
SymbolKind::Enum(_) | SymbolKind::Namespace | SymbolKind::PropNamesapce => {
692692
context.set_inner(found);
693693
context.inner = true;
694694
}
@@ -824,6 +824,7 @@ impl SymbolTable {
824824
_ => false,
825825
};
826826
let via_namespace = matches!(last_found.kind, SymbolKind::Namespace);
827+
let via_prop_namespace = matches!(last_found.kind, SymbolKind::PropNamesapce);
827828
let via_tb_component = matches!(last_found_type, Some(SymbolKind::TbComponent(_)));
828829

829830
match &found.kind {
@@ -863,6 +864,8 @@ impl SymbolTable {
863864
// defined in a packge or for generic component defined in other project
864865
via_pacakge || via_namespace
865866
}
867+
SymbolKind::ProjectProperty(_) => via_prop_namespace,
868+
SymbolKind::PropNamesapce => !via_namespace,
866869
_ => via_namespace,
867870
}
868871
}

crates/analyzer/src/tb_component.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::symbol::{
77
use crate::symbol_path::{GenericSymbol, GenericSymbolPath, GenericSymbolPathKind};
88
use crate::symbol_table::SymbolTable;
99
use veryl_parser::token_range::TokenRange;
10-
use veryl_parser::veryl_token::{Token, TokenSource, VerylToken};
10+
use veryl_parser::veryl_token::{Token, VerylToken};
1111

1212
/// A builtin `Type` with no width/array (widths for fixed types are derived
1313
/// from the `TypeKind` itself).
@@ -54,13 +54,13 @@ fn insert_method(
5454
port_defs: &[(&str, Direction)],
5555
ret: Option<Type>,
5656
) {
57-
let func_token = Token::new(name, 0, 0, 0, 0, TokenSource::Builtin);
57+
let func_token = Token::builtin_text(name);
5858
let mut func_ns = parent_ns.clone();
5959
func_ns.push(func_token.text);
6060

6161
let mut ports = Vec::new();
6262
for (port_name, direction) in port_defs {
63-
let port_token = Token::new(port_name, 0, 0, 0, 0, TokenSource::Builtin);
63+
let port_token = Token::builtin_text(port_name);
6464
let port_type = Type {
6565
modifier: vec![],
6666
kind: TypeKind::Any,
@@ -125,11 +125,11 @@ fn insert_method(
125125
/// registered; the component interface is only known at simulator load time.
126126
pub fn insert_external_components(names: &[&str]) {
127127
let mut ns = Namespace::new();
128-
let component_token = Token::new("$comp", 0, 0, 0, 0, TokenSource::Builtin);
128+
let component_token = Token::builtin_text("$comp");
129129
ns.push(component_token.text);
130130

131131
for name in names {
132-
let token = Token::new(name, 0, 0, 0, 0, TokenSource::Builtin);
132+
let token = Token::builtin_text(name);
133133
let symbol = Symbol::new(
134134
&token,
135135
SymbolKind::TbComponent(TbComponentProperty {
@@ -151,10 +151,10 @@ pub fn insert_external_components(names: &[&str]) {
151151
/// component keys never contain `::`, so the two sets cannot collide.
152152
pub fn insert_dependency_components(project: &str, names: &[&str]) {
153153
let mut ns = Namespace::new();
154-
let component_token = Token::new("$comp", 0, 0, 0, 0, TokenSource::Builtin);
154+
let component_token = Token::builtin_text("$comp");
155155
ns.push(component_token.text);
156156

157-
let project_token = Token::new(project, 0, 0, 0, 0, TokenSource::Builtin);
157+
let project_token = Token::builtin_text(project);
158158
let project_symbol = Symbol::new(
159159
&project_token,
160160
SymbolKind::Namespace,
@@ -166,7 +166,7 @@ pub fn insert_dependency_components(project: &str, names: &[&str]) {
166166
ns.push(project_token.text);
167167

168168
for name in names {
169-
let token = Token::new(name, 0, 0, 0, 0, TokenSource::Builtin);
169+
let token = Token::builtin_text(name);
170170
let key = veryl_parser::resource_table::insert_str(&format!("{project}::{name}"));
171171
let symbol = Symbol::new(
172172
&token,
@@ -190,7 +190,7 @@ fn insert_component(
190190
name: &str,
191191
kind: TbComponentKind,
192192
) -> Namespace {
193-
let token = Token::new(name, 0, 0, 0, 0, TokenSource::Builtin);
193+
let token = Token::builtin_text(name);
194194
let symbol = Symbol::new(
195195
&token,
196196
SymbolKind::TbComponent(TbComponentProperty {
@@ -253,14 +253,14 @@ fn insert_file(symbol_table: &mut SymbolTable, tb_ns: &Namespace) {
253253
}
254254

255255
fn insert_random(symbol_table: &mut SymbolTable, tb_ns: &Namespace) {
256-
let random_token = Token::new("random", 0, 0, 0, 0, TokenSource::Builtin);
256+
let random_token = Token::builtin_text("random");
257257
let mut ns = tb_ns.clone();
258258
ns.push(random_token.text);
259259

260260
// Synthesize the generic type parameter `T` inside the `$tb::random`
261261
// namespace so member methods can return `-> T`, resolved through the
262262
// normal generic pipeline at the call site.
263-
let t_token = Token::new("T", 0, 0, 0, 0, TokenSource::Builtin);
263+
let t_token = Token::builtin_text("T");
264264
let t_symbol = Symbol::new(
265265
&t_token,
266266
SymbolKind::GenericParameter(GenericParameterProperty {
@@ -325,7 +325,7 @@ pub fn insert_symbols(symbol_table: &mut SymbolTable, namespace: &Namespace) {
325325
let mut tb_ns = namespace.clone();
326326

327327
// Push into $tb namespace (already created by DEFINED_NAMESPACES)
328-
let tb_token = Token::new("$tb", 0, 0, 0, 0, TokenSource::Builtin);
328+
let tb_token = Token::builtin_text("$tb");
329329
tb_ns.push(tb_token.text);
330330

331331
insert_clock_gen(symbol_table, &tb_ns);

crates/analyzer/src/tests.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17010,14 +17010,14 @@ fn scope_tree_matches_namespace() {
1701017010
fn project_properties() {
1701117011
let code = r#"
1701217012
module ModuleA {
17013-
const A: i64 = PROP_A;
17014-
const B: bbool = PROP_B;
17013+
const A: i64 = $prop::A;
17014+
const B: bbool = $prop::B;
1701517015
}
1701617016
"#;
1701717017

1701817018
let mut properties = HashMap::new();
17019-
properties.insert("PROP_A".to_string(), ProjectProperty::Int(32));
17020-
properties.insert("PROP_B".to_string(), ProjectProperty::Bool(true));
17019+
properties.insert("A".to_string(), ProjectProperty::Int(32));
17020+
properties.insert("B".to_string(), ProjectProperty::Bool(true));
1702117021

1702217022
let errors = analyze_with_project_properties(code, properties);
1702317023
assert!(errors.is_empty());

crates/emitter/src/emitter.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6800,7 +6800,8 @@ pub fn symbol_string(
68006800
| SymbolKind::EnumMemberMangled
68016801
| SymbolKind::Test(_)
68026802
| SymbolKind::Embed
6803-
| SymbolKind::TbComponent(_) => {
6803+
| SymbolKind::TbComponent(_)
6804+
| SymbolKind::PropNamesapce => {
68046805
unreachable!()
68056806
}
68066807
}

crates/emitter/src/tests.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4263,8 +4263,8 @@ module ModuleA (
42634263
#[test]
42644264
fn project_properties() {
42654265
let code = r#"module ModuleA {
4266-
const A: i64 = PROP_A;
4267-
const B: bbool = PROP_B;
4266+
const A: i64 = $prop::A;
4267+
const B: bbool = $prop::B;
42684268
}
42694269
"#;
42704270

@@ -4278,10 +4278,10 @@ endmodule
42784278
let mut metadata = Metadata::create_default("prj").unwrap();
42794279
metadata
42804280
.properties
4281-
.insert("PROP_A".to_string(), ProjectProperty::Int(32));
4281+
.insert("A".to_string(), ProjectProperty::Int(32));
42824282
metadata
42834283
.properties
4284-
.insert("PROP_B".to_string(), ProjectProperty::Bool(true));
4284+
.insert("B".to_string(), ProjectProperty::Bool(true));
42854285

42864286
let ret = if cfg!(windows) {
42874287
emit(&metadata, code).replace("\r\n", "\n")

0 commit comments

Comments
 (0)