@@ -1763,16 +1763,17 @@ impl Emitter {
1763
1763
}
1764
1764
}
1765
1765
1766
- fn get_generic_declaration_name ( & self , generic_name : & str ) -> String {
1766
+ fn get_generic_declaration_name ( & self , generic_map : & GenericMap ) -> String {
1767
+ let name = generic_map. name ( true , self . build_opt . shorten_mangled_name ) ;
1767
1768
let ret = if self . build_opt . omit_project_prefix {
1768
1769
let project_name = format ! ( "{}_" , self . project_name. unwrap( ) ) ;
1769
- if let Some ( x) = generic_name . strip_prefix ( & project_name) {
1770
+ if let Some ( x) = name . strip_prefix ( & project_name) {
1770
1771
x
1771
1772
} else {
1772
- generic_name
1773
+ & name
1773
1774
}
1774
1775
} else {
1775
- generic_name
1776
+ & name
1776
1777
} ;
1777
1778
1778
1779
ret. replace ( "$std_" , "__std_" )
@@ -4159,7 +4160,8 @@ impl VerylWalker for Emitter {
4159
4160
self . str ( "}" ) ;
4160
4161
self . space ( 1 ) ;
4161
4162
if map. generic ( ) {
4162
- self . str ( & map. name . clone ( ) ) ;
4163
+ let name = map. name ( true , self . build_opt . shorten_mangled_name ) ;
4164
+ self . token ( & arg. identifier . identifier_token . replace ( & name) ) ;
4163
4165
} else {
4164
4166
self . identifier ( & arg. identifier ) ;
4165
4167
}
@@ -4795,7 +4797,8 @@ impl VerylWalker for Emitter {
4795
4797
}
4796
4798
self . space ( 1 ) ;
4797
4799
if map. generic ( ) {
4798
- self . str ( & map. name . clone ( ) ) ;
4800
+ let name = map. name ( true , self . build_opt . shorten_mangled_name ) ;
4801
+ self . token ( & arg. identifier . identifier_token . replace ( & name) ) ;
4799
4802
} else {
4800
4803
self . identifier ( & arg. identifier ) ;
4801
4804
}
@@ -4873,7 +4876,7 @@ impl VerylWalker for Emitter {
4873
4876
self . module ( & arg. module ) ;
4874
4877
self . space ( 1 ) ;
4875
4878
if map. generic ( ) {
4876
- let name = self . get_generic_declaration_name ( & map. name ) ;
4879
+ let name = self . get_generic_declaration_name ( map) ;
4877
4880
self . token ( & arg. identifier . identifier_token . replace ( & name) ) ;
4878
4881
} else {
4879
4882
let context: SymbolContext = self . into ( ) ;
@@ -4956,7 +4959,7 @@ impl VerylWalker for Emitter {
4956
4959
self . interface ( & arg. interface ) ;
4957
4960
self . space ( 1 ) ;
4958
4961
if map. generic ( ) {
4959
- let name = self . get_generic_declaration_name ( & map. name ) ;
4962
+ let name = self . get_generic_declaration_name ( map) ;
4960
4963
self . token ( & arg. identifier . identifier_token . replace ( & name) ) ;
4961
4964
} else {
4962
4965
let context: SymbolContext = self . into ( ) ;
@@ -5157,7 +5160,7 @@ impl VerylWalker for Emitter {
5157
5160
self . package ( & arg. package ) ;
5158
5161
self . space ( 1 ) ;
5159
5162
if map. generic ( ) {
5160
- let name = self . get_generic_declaration_name ( & map. name ) ;
5163
+ let name = self . get_generic_declaration_name ( map) ;
5161
5164
self . token ( & arg. identifier . identifier_token . replace ( & name) ) ;
5162
5165
} else {
5163
5166
let context: SymbolContext = self . into ( ) ;
@@ -5398,21 +5401,30 @@ fn namespace_string(namespace: &Namespace, context: &SymbolContext) -> String {
5398
5401
} else {
5399
5402
let symbol_path = SymbolPath :: new ( & [ * path] ) ;
5400
5403
if let Ok ( ref symbol) = symbol_table:: resolve ( ( & symbol_path, & resolve_namespace) ) {
5401
- let separator = match symbol. found . kind {
5402
- SymbolKind :: Package ( _) => "::" ,
5403
- SymbolKind :: GenericInstance ( ref x) => {
5404
- let symbol = symbol_table:: get ( x. base ) . unwrap ( ) ;
5405
- match symbol. kind {
5406
- SymbolKind :: Interface ( _) => "." ,
5407
- _ => "::" ,
5408
- }
5404
+ let text = if let SymbolKind :: GenericInstance ( ref x) = symbol. found . kind {
5405
+ let base = symbol_table:: get ( x. base ) . unwrap ( ) ;
5406
+ let separator =
5407
+ namespace_separator ( & base, context. in_direction_modport , in_sv_namespace) ;
5408
+ if context. build_opt . shorten_mangled_name {
5409
+ let name = symbol
5410
+ . found
5411
+ . generic_maps ( )
5412
+ . first ( )
5413
+ . map ( |x| x. name ( false , true ) )
5414
+ . unwrap ( ) ;
5415
+ format ! ( "{}{}" , name, separator)
5416
+ } else {
5417
+ format ! ( "{}{}" , path, separator)
5409
5418
}
5410
- SymbolKind :: Interface ( _) => "." ,
5411
- SymbolKind :: SystemVerilog if context. in_direction_modport => "." ,
5412
- _ if in_sv_namespace => "::" ,
5413
- _ => "_" ,
5419
+ } else {
5420
+ let separator = namespace_separator (
5421
+ & symbol. found ,
5422
+ context. in_direction_modport ,
5423
+ in_sv_namespace,
5424
+ ) ;
5425
+ format ! ( "{}{}" , path, separator)
5414
5426
} ;
5415
- ret. push_str ( & format ! ( "{}{}" , path , separator ) ) ;
5427
+ ret. push_str ( & text ) ;
5416
5428
} else {
5417
5429
return format ! ( "{}" , namespace) ;
5418
5430
}
@@ -5424,6 +5436,21 @@ fn namespace_string(namespace: &Namespace, context: &SymbolContext) -> String {
5424
5436
ret. replace ( "$std_" , "__std_" )
5425
5437
}
5426
5438
5439
+ fn namespace_separator (
5440
+ symbol : & Symbol ,
5441
+ in_direction_modport : bool ,
5442
+ in_sv_namespace : bool ,
5443
+ ) -> String {
5444
+ let separator = match symbol. kind {
5445
+ SymbolKind :: Package ( _) => "::" ,
5446
+ SymbolKind :: Interface ( _) => "." ,
5447
+ SymbolKind :: SystemVerilog if in_direction_modport => "." ,
5448
+ _ if in_sv_namespace => "::" ,
5449
+ _ => "_" ,
5450
+ } ;
5451
+ separator. to_string ( )
5452
+ }
5453
+
5427
5454
pub fn symbol_string ( token : & VerylToken , symbol : & Symbol , context : & SymbolContext ) -> String {
5428
5455
let mut ret = String :: new ( ) ;
5429
5456
let namespace = namespace_table:: get ( token. token . id ) . unwrap ( ) ;
@@ -5486,7 +5513,16 @@ pub fn symbol_string(token: &VerylToken, symbol: &Symbol, context: &SymbolContex
5486
5513
if !visible | top_level {
5487
5514
ret. push_str ( & namespace_string ( & symbol. namespace , context) ) ;
5488
5515
}
5489
- ret. push_str ( & token_text) ;
5516
+ if context. build_opt . shorten_mangled_name {
5517
+ let name = symbol
5518
+ . generic_maps ( )
5519
+ . first ( )
5520
+ . map ( |x| x. name ( true , true ) )
5521
+ . unwrap ( ) ;
5522
+ ret. push_str ( & name) ;
5523
+ } else {
5524
+ ret. push_str ( & token_text) ;
5525
+ }
5490
5526
}
5491
5527
SymbolKind :: GenericParameter ( _)
5492
5528
| SymbolKind :: ProtoModule ( _)
0 commit comments