@@ -1118,10 +1118,14 @@ impl SVModule {
1118
1118
& ' a self ,
1119
1119
signal : & ' a str ,
1120
1120
walk : & mut HashSet < & ' a str > ,
1121
+ visited : & mut HashSet < & ' a str > ,
1121
1122
) -> Result < ( ) , & ' a str > {
1122
1123
if walk. contains ( signal) {
1123
1124
return Err ( signal) ;
1124
1125
}
1126
+ if visited. contains ( signal) {
1127
+ return Ok ( ( ) ) ;
1128
+ }
1125
1129
walk. insert ( signal) ;
1126
1130
let driving = self . get_driving_primitive ( signal) ;
1127
1131
if driving. is_err ( ) {
@@ -1130,18 +1134,20 @@ impl SVModule {
1130
1134
}
1131
1135
let driving = driving. unwrap ( ) ;
1132
1136
for ( _, driver) in driving. inputs . iter ( ) {
1133
- self . contains_cycles_rec ( driver, walk) ?
1137
+ self . contains_cycles_rec ( driver, walk, visited ) ?
1134
1138
}
1135
1139
walk. remove ( signal) ;
1140
+ visited. insert ( signal) ;
1136
1141
Ok ( ( ) )
1137
1142
}
1138
1143
1139
1144
/// We cannot lower verilog with cycles in it to LutLang expressions.
1140
1145
/// This function returns [Ok] when there are no cycles in the module
1141
1146
pub fn contains_cycles < ' a > ( & ' a self ) -> Result < ( ) , & ' a str > {
1147
+ let mut visited = HashSet :: new ( ) ;
1142
1148
for output in self . outputs . iter ( ) {
1143
1149
let mut stack: HashSet < & ' a str > = HashSet :: new ( ) ;
1144
- self . contains_cycles_rec ( output. get_name ( ) , & mut stack) ?
1150
+ self . contains_cycles_rec ( output. get_name ( ) , & mut stack, & mut visited ) ?
1145
1151
}
1146
1152
Ok ( ( ) )
1147
1153
}
0 commit comments