@@ -1690,36 +1690,61 @@ impl<'l, 'c: 'l> FlatteningContext<'l, '_> {
16901690 self . alloc_local_name ( clock_name_span, clock_name, NamedLocal :: ClockDecl ( clock_id) ) ;
16911691 }
16921692
1693- fn flatten_write_modifiers ( & self , cursor : & mut Cursor < ' c > ) -> WriteModifiers {
1693+ fn flatten_reg_modifier ( & mut self , cursor : & mut Cursor < ' c > ) -> RegExpression {
1694+ let whole_span = cursor. span ( ) ;
1695+ cursor. go_down ( kind ! ( "reg_modifier" ) , move |cursor| {
1696+ let reg_parameter = if cursor. optional_field ( field ! ( "reg_param" ) ) {
1697+ let bracket_span = BracketSpan :: from_outer ( cursor. span ( ) ) ;
1698+ cursor. go_down_content ( kind ! ( "parenthesis_expression" ) , move |cursor| {
1699+ let expr_id = self . flatten_subexpr ( cursor) ;
1700+ Some ( ( expr_id, bracket_span) )
1701+ } )
1702+ } else {
1703+ None
1704+ } ;
1705+ RegExpression {
1706+ whole_span,
1707+ reg_parameter,
1708+ }
1709+ } )
1710+ }
1711+
1712+ fn flatten_write_modifiers ( & mut self , cursor : & mut Cursor < ' c > ) -> WriteModifiers {
16941713 if cursor. optional_field ( field ! ( "write_modifiers" ) ) {
1695- let modifiers_span = cursor. span ( ) ;
1696- let mut initial_count = 0 ;
1697- let mut reg_count = 0 ;
1714+ let mut initial_kw_span: Option < Span > = None ;
1715+ let mut regs: Vec < RegExpression > = Vec :: new ( ) ;
16981716 cursor. list ( kind ! ( "write_modifiers" ) , |cursor| {
16991717 let kw_kind = cursor. kind ( ) ;
1700- if kw_kind == kw ! ( "reg " ) {
1701- reg_count += 1 ;
1718+ if kw_kind == kind ! ( "reg_modifier " ) {
1719+ regs . push ( self . flatten_reg_modifier ( cursor ) ) ;
17021720 } else if kw_kind == kw ! ( "initial" ) {
1703- initial_count += 1 ;
1721+ let span = cursor. span ( ) ;
1722+ if let Some ( prev_kw) = initial_kw_span {
1723+ self . errors
1724+ . error ( span, "This write already has an 'initial' keyword" )
1725+ . info ( prev_kw, "Previous 'initial' keyword" ) ;
1726+ } else {
1727+ initial_kw_span = Some ( span) ;
1728+ }
17041729 } else {
17051730 unreachable ! ( )
17061731 }
17071732 } ) ;
1708- match ( initial_count, reg_count) {
1709- ( 0 , num_regs) => WriteModifiers :: Connection {
1710- num_regs,
1711- regs_span : modifiers_span,
1712- } ,
1713- ( 1 , 0 ) => WriteModifiers :: Initial {
1714- initial_kw_span : modifiers_span,
1715- } ,
1716- _other => unreachable ! ( ) ,
1733+ if let Some ( initial_kw_span) = initial_kw_span {
1734+ for r in & regs {
1735+ self . errors
1736+ . error (
1737+ r. whole_span ,
1738+ "Cannot both place pipeline regs on an 'initial' write." ,
1739+ )
1740+ . info ( initial_kw_span, "'Initial' keyword used here" ) ;
1741+ }
1742+ WriteModifiers :: Initial { initial_kw_span }
1743+ } else {
1744+ WriteModifiers :: Connection { regs }
17171745 }
17181746 } else {
1719- WriteModifiers :: Connection {
1720- num_regs : 0 ,
1721- regs_span : cursor. span ( ) . empty_span_at_front ( ) ,
1722- }
1747+ WriteModifiers :: Connection { regs : Vec :: new ( ) }
17231748 }
17241749 }
17251750
0 commit comments