from litex.build.generic_platform import *
from litex.build.altera import AlteraPlatform
from litex.build.altera.programmer import USBBlaster

# I/O --------------------------------------------------------------------------

_io = [

    # Persistent I/O - fixed on the AC440B itself ------------------------------
    
    # Clk
    ("clk50", 0, Pins("T2"), IOStandard("3.3-V LVTTL")),

    # D1-D4
    ("u_led_n", 0, Pins("V22"), IOStandard("3.3-V LVTTL")),
    ("u_led_n", 1, Pins("V21"), IOStandard("3.3-V LVTTL")),
    ("u_led_n", 2, Pins("U22"), IOStandard("3.3-V LVTTL")),
    ("u_led_n", 3, Pins("U21"), IOStandard("3.3-V LVTTL")),

    # RST, K1-K2
    ("rst_n", 0, Pins("D2"), IOStandard("3.3-V LVTTL")),
    ("u_key_n",    0, Pins("W1"), IOStandard("3.3-V LVTTL")),
    ("u_key_n",    1, Pins("V1"), IOStandard("3.3-V LVTTL")),

    # Persistent I/O end -------------------------------------------------------

    ("serial", 0,
        Subsignal("tx", Pins("Y22"), IOStandard("3.3-V LVTTL")),
        Subsignal("rx", Pins("W22"), IOStandard("3.3-V LVTTL"))
    ),

 ]

_connectors = [

]

# Platform ---------------------------------------------------------------------

class Platform(AlteraPlatform):
    default_clk_name   = "clk50"
    default_clk_period = 1e9/50e6

    def __init__(self, toolchain="quartus"):
        AlteraPlatform.__init__(self, "EP4CE40F23C8", _io, _connectors, toolchain=toolchain)
        self.add_platform_command("set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION \"USE AS REGULAR IO\"")

    def create_programmer(self):
        return USBBlaster()

    def do_finalize(self, fragment):
        AlteraPlatform.do_finalize(self, fragment)
        self.add_period_constraint(self.lookup_request("clk50", loose=True), 1e9/50e6)
