@@ -55,6 +55,22 @@ class SimpleStructModule extends Module {
5555 }
5656}
5757
58+ class OneBitStruct extends LogicStructure {
59+ OneBitStruct ({super .name = 'obs' }) : super ([Logic (name: 'oneBit' )]);
60+
61+ @override
62+ OneBitStruct clone ({String ? name}) => OneBitStruct (name: name ?? this .name);
63+ }
64+
65+ class ModuleWithOneBitStructPort extends Module {
66+ ModuleWithOneBitStructPort (OneBitStruct inStruct) {
67+ inStruct = addTypedInput ('inStruct' , inStruct);
68+ final outStruct = addTypedOutput ('outStruct' , inStruct.clone);
69+
70+ outStruct.elements.first.gets (inStruct.elements.first);
71+ }
72+ }
73+
5874class SimpleStructModuleContainer extends Module {
5975 SimpleStructModuleContainer (Logic a1, Logic a2,
6076 {super .name = 'simple_struct_mod_container' , bool asNet = false }) {
@@ -408,4 +424,22 @@ void main() {
408424 });
409425 }
410426 });
427+
428+ test ('single bit struct port partial assignment' , () async {
429+ final mod = ModuleWithOneBitStructPort (OneBitStruct ());
430+ await mod.build ();
431+
432+ final sv = mod.generateSynth ();
433+
434+ // no slicing on single-bit signals
435+ expect (sv, contains ('assign outStruct = outStruct_oneBit' ));
436+
437+ final vectors = [
438+ Vector ({'inStruct' : 0 }, {'outStruct' : 0 }),
439+ Vector ({'inStruct' : 1 }, {'outStruct' : 1 }),
440+ ];
441+
442+ await SimCompare .checkFunctionalVector (mod, vectors);
443+ SimCompare .checkIverilogVector (mod, vectors);
444+ });
411445}
0 commit comments