@@ -59,6 +59,7 @@ pub struct Module {
5959 pub public_inputs : BTreeMap < Identifier , PublicInput > ,
6060 pub random_values : Option < RandomValues > ,
6161 pub trace_columns : Vec < TraceSegment > ,
62+ pub buses : BTreeMap < Identifier , Bus > ,
6263 pub boundary_constraints : Option < Span < Vec < Statement > > > ,
6364 pub integrity_constraints : Option < Span < Vec < Statement > > > ,
6465}
@@ -81,6 +82,7 @@ impl Module {
8182 constants : Default :: default ( ) ,
8283 evaluators : Default :: default ( ) ,
8384 functions : Default :: default ( ) ,
85+ buses : Default :: default ( ) ,
8486 periodic_columns : Default :: default ( ) ,
8587 public_inputs : Default :: default ( ) ,
8688 random_values : None ,
@@ -152,6 +154,11 @@ impl Module {
152154 Declaration :: IntegrityConstraints ( statements) => {
153155 module. declare_integrity_constraints ( diagnostics, statements) ?;
154156 }
157+ Declaration :: Buses ( mut buses) => {
158+ for bus in buses. drain ( ..) {
159+ module. declare_bus ( diagnostics, & mut names, bus) ?;
160+ }
161+ }
155162 }
156163 }
157164
@@ -416,6 +423,22 @@ impl Module {
416423 Ok ( ( ) )
417424 }
418425
426+ fn declare_bus (
427+ & mut self ,
428+ diagnostics : & DiagnosticsHandler ,
429+ names : & mut HashSet < NamespacedIdentifier > ,
430+ bus : Bus ,
431+ ) -> Result < ( ) , SemanticAnalysisError > {
432+ if let Some ( prev) = names. replace ( NamespacedIdentifier :: Bus ( bus. name ) ) {
433+ conflicting_declaration ( diagnostics, "bus" , prev. span ( ) , bus. name . span ( ) ) ;
434+ return Err ( SemanticAnalysisError :: NameConflict ( bus. name . span ( ) ) ) ;
435+ }
436+
437+ self . buses . insert ( bus. name , bus) ;
438+
439+ Ok ( ( ) )
440+ }
441+
419442 fn declare_periodic_column (
420443 & mut self ,
421444 diagnostics : & DiagnosticsHandler ,
0 commit comments