- with m.If(bus.adr[ADDROFFSET:] == OADDR):
- sync += gpio_o_list[gpio_addr].eq(wb_wr_data[OSHIFT])
- # Write/set CSR
- with m.Else():
- sync += gpio_o_list[gpio_addr].eq(wb_wr_data[OSHIFT])
- sync += gpio_oe_list[gpio_addr].eq(wb_wr_data[OESHIFT])
- sync += bank_sel.eq(wb_wr_data[BANKSHIFT:BANKSHIFT+4])
+ sync += gpio_oe_list[gpio_addr].eq(wb_wr_data[OESHIFT])
+ sync += gpio_ie_list[gpio_addr].eq(wb_wr_data[IESHIFT])
+ # check GPIO is in output mode and NOT input (oe high, ie low)
+ with m.If(wb_wr_data[OESHIFT] & (~wb_wr_data[IESHIFT])):
+ sync += gpio_o_list[gpio_addr].eq(wb_wr_data[IOSHIFT])
+ sync += puen_list[gpio_addr].eq(wb_wr_data[PUSHIFT])
+ sync += pden_list[gpio_addr].eq(wb_wr_data[PDSHIFT])
+ # TODO: clean up name
+ sync += bank_sel[gpio_addr].eq(
+ wb_wr_data[BANKSHIFT:BANKSHIFT+NUM_BANKSEL_BITS])