This is what I created for my OSPI PSRAM def: ```def OctalSPIResources(*args, cs_n, clk, reset, wp_n=None, hold_n=None, conn=None, attrs=None): resources = [] io_all = [] if attrs is not None: io_all.append(attrs) # CS (aka CE) io_all.append(Subsignal("cs", PinsN("E16", dir="o", conn=conn, assert_width=1))) io_all.append(Subsignal("clk", Pins("J15", dir="o", conn=conn, assert_width=1))) # Reset may not be available for all package types. For example, APS256XXN does not # have a reset pin. Signal is active low. # Optional, as the pad is internally tied to a weak pull-up and can be left floating. io_all.append(Subsignal("reset", PinsN("-", dir="o", conn=conn, assert_width=1))) io_1x = list(io_all) # Address and lower data bus (X8 and X16 mode) # 0 -------------------------------> 7 io_1x.append(Subsignal("ad", Pins(" ".join([L16, K16, K14, M15, P16, N16, M16, K15]), dir="io", conn=conn, assert_width=8))) # Data upper bus (X16 mode only) io_1x.append(Subsignal("d", Pins(" ".join([J14, J16, E14, D16, D15, F14, F15, L14]), dir="io", conn=conn, assert_width=8))) # DQ strobe clock for DQ[7:0] during all reads, Data mask for # DQ during memory writes. DM is active high. DM=1 means “do not write”. io_1x.append(Subsignal("strb0", Pins("K13", dir="io", conn=conn, assert_width=1))) # DQ strobe clock for DQ[15:8] during memory reads, Data mask # for DQ during memory writes. DM is active high. DM=1 means “do not write”. io_1x.append(Subsignal("strb1", Pins("H14", dir="io", conn=conn, assert_width=1))) resources.append(Resource.family(*args, default_name="ospi_psram", ios=io_1x, name_suffix="1x")) return resources ```