Skip to content

Commit 8d9eb72

Browse files
authored
Speed up cycle detection (#108)
1 parent 058b560 commit 8d9eb72

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

src/verilog.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,10 +1118,14 @@ impl SVModule {
11181118
&'a self,
11191119
signal: &'a str,
11201120
walk: &mut HashSet<&'a str>,
1121+
visited: &mut HashSet<&'a str>,
11211122
) -> Result<(), &'a str> {
11221123
if walk.contains(signal) {
11231124
return Err(signal);
11241125
}
1126+
if visited.contains(signal) {
1127+
return Ok(());
1128+
}
11251129
walk.insert(signal);
11261130
let driving = self.get_driving_primitive(signal);
11271131
if driving.is_err() {
@@ -1130,18 +1134,20 @@ impl SVModule {
11301134
}
11311135
let driving = driving.unwrap();
11321136
for (_, driver) in driving.inputs.iter() {
1133-
self.contains_cycles_rec(driver, walk)?
1137+
self.contains_cycles_rec(driver, walk, visited)?
11341138
}
11351139
walk.remove(signal);
1140+
visited.insert(signal);
11361141
Ok(())
11371142
}
11381143

11391144
/// We cannot lower verilog with cycles in it to LutLang expressions.
11401145
/// This function returns [Ok] when there are no cycles in the module
11411146
pub fn contains_cycles<'a>(&'a self) -> Result<(), &'a str> {
1147+
let mut visited = HashSet::new();
11421148
for output in self.outputs.iter() {
11431149
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)?
11451151
}
11461152
Ok(())
11471153
}

0 commit comments

Comments
 (0)