# Pastebin pebPfcU2 def elaborate(self, platform): m = Module() m.submodules += self.analyzer m.submodules.i_buffer = i_buffer = io.Buffer("i", self.ports.i) pins_i = Signal.like(i_buffer.i) pins_r = Signal.like(i_buffer.i) m.submodules += FFSynchronizer(i_buffer.i, pins_i) # This works... #m.d.sync += triggered.eq((pins_i[0] & ~pins_i[1]) | triggered) # Why doesn't this?? :( trigger_string = "10xx" trigger = Signal() triggered = Signal() if trigger_string: assert len(trigger_string) == len(self.ports.i) for index, state in enumerate(trigger_string): if state == "1": trigger &= pins_i[index] elif state == "0": trigger &= ~pins_i[index] else: pass # can be x or anything else m.d.sync += triggered.eq(trigger | triggered) with m.If(triggered): m.d.sync += pins_r.eq(pins_i) m.d.comb += [ self.event_source.data.eq(pins_i), self.event_source.trigger.eq(pins_i != pins_r) ] return m