12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061open!Importletverify_clock_pins~expected_clock_pins(t:Circuit.t)=letrectransitively_resolve(signal:Signal.t)=matchsignalwith|Empty->assertfalse|Wire{signal_id;driver}->(match!driverwith|Empty->signal_id|otherwise->transitively_resolveotherwise)|Op2_|Not_|Cat_|Mux_|Const_|Select_|Reg_|Mem_|Multiport_mem_|Mem_read_port_|Inst_->(matchSignal.signal_idsignalwith|None->assertfalse|Somes->s)inletclock_domains=Signal_graph.depth_first_search(Circuit.signal_grapht)~init:Signal.Uid_map.empty~f_before:(fununchangedsignal->matchsignalwith|Mem{register=r;_}|Reg{register=r;_}->letclock_domain=transitively_resolver.reg_clockinMap.add_multiunchanged~key:clock_domain.s_id~data:(clock_domain,signal)|Multiport_mem{write_ports;_}->Array.foldwrite_ports~init:unchanged~f:(funaccport->letclock_domain=transitively_resolveport.write_clockinMap.add_multiacc~key:clock_domain.s_id~data:(clock_domain,signal))|_->unchanged)inletexpected_clock_domains=Hash_set.of_list(moduleString)expected_clock_pinsinMap.itericlock_domains~f:(fun~key:signal_uid~data:all->letclock_domain_in_expected=List.existsall~f:(fun(clock_domain,_)->List.existsclock_domain.s_names~f:(funname->ifHash_set.memexpected_clock_domainsnamethen(Hash_set.removeexpected_clock_domainsname;true)elsefalse))inletsignals=List.map~f:sndallinifnotclock_domain_in_expectedthenraise_s[%message"The following sequential elements have unexpected clock pin connections"(signal_uid:int64)(signals:Signal.tlist)]);;