1- // RUN: circt-opt -pass-pipeline='builtin.module(firrtl.circuit(firrtl-infer-domains{infer-public=true }))' %s --verify-diagnostics --split-input-file
1+ // RUN: circt-opt -pass-pipeline='builtin.module(firrtl.circuit(firrtl-infer-domains{mode= infer-all }))' %s --verify-diagnostics --split-input-file
22
33// Port annotated with same domain type twice.
44firrtl.circuit " DomainCrossOnPort" {
@@ -112,18 +112,38 @@ firrtl.circuit "Top" {
112112
113113// -----
114114
115- // Domain not exported like it should be.
115+ // Domain exported multiple times. Which do we choose?
116+
117+ firrtl.circuit " DoubleExportOfDomain" {
118+ firrtl.domain @ClockDomain
119+
120+ firrtl.module @DoubleExportOfDomain (
121+ // expected-note @below {{candidate association "DI"}}
122+ in %DI : !firrtl.domain of @ClockDomain ,
123+ // expected-note @below {{candidate association "DO"}}
124+ out %DO : !firrtl.domain of @ClockDomain ,
125+ in %i : !firrtl.uint <1 > domains [%DO ],
126+ // expected-error @below {{ambiguous "ClockDomain" association for port "o"}}
127+ out %o : !firrtl.uint <1 > domains []
128+ ) {
129+ // DI and DO are aliases
130+ firrtl.domain.define %DO , %DI
131+
132+ // o is on same domain as i
133+ firrtl.matchingconnect %o , %i : !firrtl.uint <1 >
134+ }
135+ }
116136
117137// -----
118138
119- // Domain exported multiple times. Which do we choose?
139+ // Domain exported multiple times, this time with one input and one output . Which do we choose?
120140
121141firrtl.circuit " DoubleExportOfDomain" {
122- firrtl.domain @ClockDomain
142+ firrtl.domain @ClockDomain
123143
124144 firrtl.module @DoubleExportOfDomain (
125145 // expected-note @below {{candidate association "DI"}}
126- in %DI : !firrtl.domain of @ClockDomain ,
146+ out %DI : !firrtl.domain of @ClockDomain ,
127147 // expected-note @below {{candidate association "DO"}}
128148 out %DO : !firrtl.domain of @ClockDomain ,
129149 in %i : !firrtl.uint <1 > domains [%DO ],
@@ -138,3 +158,31 @@ firrtl.circuit "DoubleExportOfDomain" {
138158 }
139159}
140160
161+ // -----
162+
163+ // InstanceChoice: Each module has different domains inferred.
164+
165+ firrtl.circuit " ConflictingInstanceChoiceDomains" {
166+ firrtl.domain @ClockDomain
167+
168+ firrtl.option @Option {
169+ firrtl.option_case @X
170+ firrtl.option_case @Y
171+ }
172+
173+ // Foo's "out" port takes on the domains of "in1".
174+ firrtl.module @Foo (in %in1: !firrtl.uint <1 >, in %in2: !firrtl.uint <1 >, out %out: !firrtl.uint <1 >) {
175+ firrtl.connect %out , %in1 : !firrtl.uint <1 >
176+ }
177+
178+ // Bar's "out" port takes on the domains of "in2".
179+ firrtl.module @Bar (in %in1: !firrtl.uint <1 >, in %in2: !firrtl.uint <1 >, out %out: !firrtl.uint <1 >) {
180+ firrtl.connect %out , %in2 : !firrtl.uint <1 >
181+ }
182+
183+ firrtl.module @ConflictingInstanceChoiceDomains (in %in1: !firrtl.uint <1 >, in %in2: !firrtl.uint <1 >) {
184+ %inst_in1 , %inst_in2 , %inst_out = firrtl.instance_choice inst @Foo alternatives @Option { @X -> @Foo , @Y -> @Bar } (in in1 : !firrtl.uint <1 >, in in2 : !firrtl.uint <1 >, out out : !firrtl.uint <1 >)
185+ firrtl.connect %inst_in1 , %in1 : !firrtl.uint <1 >, !firrtl.uint <1 >
186+ firrtl.connect %inst_in2 , %in2 : !firrtl.uint <1 >, !firrtl.uint <1 >
187+ }
188+ }
0 commit comments