diff --git a/litex_boards/platforms/digilent_atlys.py b/litex_boards/platforms/digilent_atlys.py
index 37b1d8d..af73fc1 100644
--- a/litex_boards/platforms/digilent_atlys.py
+++ b/litex_boards/platforms/digilent_atlys.py
@@ -1,705 +1,235 @@
-# Support for the Digilent Atlys (http://digilentinc.com/atlys/) - The board used for HDMI2USB prototyping.
+#
+# This file is part of LiteX-Boards.
+#
+# Copyright (c) 2015-2021 HDMI2USB/LiteX developers
+# SPDX-License-Identifier: BSD-2-Clause
 
 from litex.build.generic_platform import *
-from litex.build.xilinx import XilinxPlatform, iMPACT
-
-# There appear to be 4 x LTC2481C on the U1-SCL / U1-SDA lines connected to the Cypress
-
-class DynamicLVCMOS(object):
-    """Object to allow configuration of IOBs connected to dynamic voltage level.
-
-    This is used because VCCB2 supply for Bank 2 can be connected to either the
-    VCC2V5 or VCC3V3 rail depending on JP12, however there is no way to
-    autodetect this.
-    """
-
-    def __init__(self, name):
-        self.name = name
-        self.level = None
-
-    def set(self, value):
-        self.level = {
-            "VCC2V5": "LVCMOS25",
-            "VCC3V3": "LVCMOS33",
-        }[value]
-
-    def __str__(self):
-        assert self.level, "%s object accessed before voltage level set!" % self.name
-        return self.level
-
-    def __add__(self, o):
-        return str(self) + o
-
-    def __radd__(self, o):
-        return o + str(self)
-
-
-# VCC Bank 0 == 3V3
-LVCMOS_BANK0 = "LVCMOS33"
-# VCC Bank 1 == 3V3
-LVCMOS_BANK1 = "LVCMOS33"
-# VCC Bank 2 == 3V3 or 2V5
-LVCMOS_BANK2 = DynamicLVCMOS("LVCMOS_BANK2")
-# VCC Bank 3 == 1V8
-LVCMOS_BANK3 = "LVCMOS18"
-# VCC Aux    == 3V3
+from litex.build.xilinx import XilinxPlatform
 
+# IOs ----------------------------------------------------------------------------------------------
 
 _io = [
-    # NET "clk"   LOC = "L15"; # Bank = 1, Pin name = IO_L42P_GCLK7_M1UDM, Type = GCLK, Sch name = GCLK
-    # SG8002JF - 100MHz - CMOS Crystal Oscillator
-    ("clk100", 0, Pins("L15"), IOStandard(LVCMOS_BANK1)),
+    # Clk/Rst
+    ("clk100",    0, Pins("L15"), IOStandard("LVCMOS33")),
+    ("cpu_reset", 0, Pins("T15"), IOStandard("LVCMOS33")),
 
-    # M0/RESET button
-    #  VCCB2 --[10K]--+--[1k]-- M0/Reset
-    #                 |
-    #    GND -[ BTN ]-+--[390]- BTNRST
-    # NET "btn<0>" LOC = "T15"; # Bank = 2, Pin name = IO_L1N_M0_CMPMISO_2,    Sch name = M0/RESET
-    ("cpu_reset", 0, Pins("T15"), IOStandard(LVCMOS_BANK2)),
+    # Serial
+    ("serial", 0,
+        Subsignal("rx", Pins("A16"), IOStandard("LVCMOS33")),
+        Subsignal("tx", Pins("B16"), IOStandard("LVCMOS33")),
+    ),
 
-    ## onBoard USB controller - FIXME
-    # CY7C68013A-56
-    # EEPROM config 24AA128 -- A0,A1,A2 = 1,0,0 -- JP9 connects / disconnects SDA
-    # NET "EppAstb"   LOC = "B9";  # Bank = 0, Pin name = IO_L35P_GCLK17, Sch name = U1-FLAGA
-    # NET "EppDstb"   LOC = "A9";  # Bank = 0, Pin name = IO_L35N_GCLK16, Sch name = U1-FLAGB
-    # NET "UsbFlag"   LOC = "C15"; # Bank = 0, Pin name = IO_L64P_SCP5,   Sch name = U1-FLAGC
-    # NET "EppWait"   LOC = "F13"; # Bank = 0, Pin name = IO_L63P_SCP7,   Sch name = U1-SLRD
-    # NET "EppDB<0>"  LOC = "A2";  # Bank = 0, Pin name = IO_L2N,         Sch name = U1-FD0
-    # NET "EppDB<1>"  LOC = "D6";  # Bank = 0, Pin name = IO_L3P,         Sch name = U1-FD1
-    # NET "EppDB<2>"  LOC = "C6";  # Bank = 0, Pin name = IO_L3N,         Sch name = U1-FD2
-    # NET "EppDB<3>"  LOC = "B3";  # Bank = 0, Pin name = IO_L4P,         Sch name = U1-FD3
-    # NET "EppDB<4>"  LOC = "A3";  # Bank = 0, Pin name = IO_L4N,         Sch name = U1-FD4
-    # NET "EppDB<5>"  LOC = "B4";  # Bank = 0, Pin name = IO_L5P,         Sch name = U1-FD5
-    # NET "EppDB<6>"  LOC = "A4";  # Bank = 0, Pin name = IO_L5N,         Sch name = U1-FD6
-    # NET "EppDB<7>"  LOC = "C5";  # Bank = 0, Pin name = IO_L6P,         Sch name = U1-FD7
-
-    # HDMI2USB configuration....
+    # FX2
     ("fx2", 0,
-        Subsignal("ifclk", Pins("C10")),
-        Subsignal("data", Pins("A2 D6 C6 B3 A3 B4 A4 C5")),
-        Subsignal("addr", Pins("A14 B14"), Misc("DRIVE=12")),
-        Subsignal("flaga", Pins("B9"), Misc("DRIVE=12")),
-        Subsignal("flagb", Pins("A9"), Misc("DRIVE=12")),
-        Subsignal("flagc", Pins("C15"), Misc("DRIVE=12")),
-        Subsignal("rd_n", Pins("F13"), Misc("DRIVE=12")),
-        Subsignal("wr_n", Pins("E13")),
-        Subsignal("oe_n", Pins("A15"), Misc("DRIVE=12")),
-        Subsignal("cs_n", Pins("B2")),
+        Subsignal("ifclk",    Pins("C10")),
+        Subsignal("data",     Pins("A2 D6 C6 B3 A3 B4 A4 C5")),
+        Subsignal("addr",     Pins("A14 B14"), Misc("DRIVE=12")),
+        Subsignal("flaga",    Pins("B9"),  Misc("DRIVE=12")),
+        Subsignal("flagb",    Pins("A9"),  Misc("DRIVE=12")),
+        Subsignal("flagc",    Pins("C15"), Misc("DRIVE=12")),
+        Subsignal("rd_n",     Pins("F13"), Misc("DRIVE=12")),
+        Subsignal("wr_n",     Pins("E13")),
+        Subsignal("oe_n",     Pins("A15"), Misc("DRIVE=12")),
+        Subsignal("cs_n",     Pins("B2")),
         Subsignal("pktend_n", Pins("C4"), Misc("DRIVE=12")),
-        IOStandard(LVCMOS_BANK0)
+        IOStandard("LVCMOS33")
     ),
 
-    ## onBoard Quad-SPI Flash
-    # 16Mbyte x4 SPI Flash for configuration & data storage. An FPGA
-    # configuration file requires less than 12Mbits, leaving 116Mbits
-    # available for user data.
-    # Numonyx -- N25Q12-F8 or N25Q12-SF
-    # DQ0 - SDI, DQ1 - SDO, DQ2 -> ^WP/DQ2 (pulled high), DQ3 -> ^HOLD/DQ3 (pulled high)
+    # SPI Flash
     ("spiflash4x", 0,
-        # NET "FlashCS"     LOC = "V3";  # Bank = 2, Pin name = IO_L65N_CSO_B_2, Sch name = CS
         Subsignal("cs_n", Pins("V3")),
-        # NET "FlashCLK"     LOC = "R15"; # Bank = 2, Pin name = IO_L1P_CCLK_2, Sch name = SCK
-        Subsignal("clk", Pins("R15")),
-        # NET "FlashMemDq<0>"     LOC = "T13"; # Bank = 2, Pin name = IO_L3N_MOSI_CSI_B_MISO0_2,  Sch name = SDI
-        # NET "FlashMemDq<1>"     LOC = "R13"; # Bank = 2, Pin name = IO_L3P_D0_DIN_MISO_MISO1_2, Sch name = DQ1
-        # NET "FlashMemDq<2>"     LOC = "T14"; # Bank = 2, Pin name = IO_L12P_D1_MISO2_2, Sch name = DQ2
-        # NET "FlashMemDq<3>"     LOC = "V14"; # Bank = 2, Pin name = IO_L12N_D2_MISO3_2, Sch name = DQ3
-        Subsignal("dq", Pins("T13", "R13", "T14", "V14")),
-        IOStandard(LVCMOS_BANK2), Misc("SLEW=FAST")
+        Subsignal("clk",  Pins("R15")),
+        Subsignal("dq",   Pins("T13", "R13", "T14", "V14")),
+        IOStandard("LVCMOS33"),
+        Misc("SLEW=FAST"),
     ),
 
-    ## onBoard Leds
-    # NET "Led<0>" LOC = "U18"; # Bank = 1, Pin name = IO_L52N_M1DQ15,       Sch name = LD0
-    # NET "Led<1>" LOC = "M14"; # Bank = 1, Pin name = IO_L53P,              Sch name = LD1
-    # NET "Led<2>" LOC = "N14"; # Bank = 1, Pin name = IO_L53N_VREF,         Sch name = LD2
-    # NET "Led<3>" LOC = "L14"; # Bank = 1, Pin name = IO_L61P,              Sch name = LD3
-    # NET "Led<4>" LOC = "M13"; # Bank = 1, Pin name = IO_L61N,              Sch name = LD4
-    # NET "Led<5>" LOC = "D4";  # Bank = 0, Pin name = IO_L1P_HSWAPEN_0,     Sch name = HSWAP/LD5
-    # NET "Led<6>" LOC = "P16"; # Bank = 1, Pin name = IO_L74N_DOUT_BUSY_1,  Sch name = LD6
-    # NET "Led<7>" LOC = "N12"; # Bank = 2, Pin name = IO_L13P_M1_2,         Sch name = M1/LD7
-    ("user_led", 0, Pins("U18"), IOStandard(LVCMOS_BANK1)),
-    ("user_led", 1, Pins("M14"), IOStandard(LVCMOS_BANK1)),
-    ("user_led", 2, Pins("N14"), IOStandard(LVCMOS_BANK1)),
-    ("user_led", 3, Pins("L14"), IOStandard(LVCMOS_BANK1)),
-    ("user_led", 4, Pins("M13"), IOStandard(LVCMOS_BANK1)),
-    ("user_led", 5, Pins("D4"),  IOStandard(LVCMOS_BANK0)),
-    ("user_led", 6, Pins("P16"), IOStandard(LVCMOS_BANK1)),
-    ("user_led", 7, Pins("N12"), IOStandard(LVCMOS_BANK2)),
+    # Leds
+    ("user_led", 0, Pins("U18"), IOStandard("LVCMOS33")),
+    ("user_led", 1, Pins("M14"), IOStandard("LVCMOS33")),
+    ("user_led", 2, Pins("N14"), IOStandard("LVCMOS33")),
+    ("user_led", 3, Pins("L14"), IOStandard("LVCMOS33")),
+    ("user_led", 4, Pins("M13"), IOStandard("LVCMOS33")),
+    ("user_led", 5, Pins("D4"),  IOStandard("LVCMOS33")),
+    ("user_led", 6, Pins("P16"), IOStandard("LVCMOS33")),
+    ("user_led", 7, Pins("N12"), IOStandard("LVCMOS33")),
 
-    ## onBoard PUSH BUTTONS - FIXME
-    # Mapping "up" to north
-    # VCC1V8 - pulled down to GND via 10k
-    # NET "btn<1>" LOC = "N4";  # Bank = 3, Pin name = IO_L1P,               Sch name = BTNU
-    ("user_btn", 0, Pins("N4"), IOStandard(LVCMOS_BANK3)), # North button
-    # NET "btn<2>" LOC = "P4";  # Bank = 3, Pin name = IO_L2P,               Sch name = BTNL
-    ("user_btn", 1, Pins("P4"), IOStandard(LVCMOS_BANK3)), # East button
-    # NET "btn<3>" LOC = "P3";  # Bank = 3, Pin name = IO_L2N,               Sch name = BTND
-    ("user_btn", 2, Pins("P3"), IOStandard(LVCMOS_BANK3)), # South button
-    # NET "btn<4>" LOC = "F6";  # Bank = 3, Pin name = IO_L55P_M3A13,        Sch name = BTNR
-    ("user_btn", 3, Pins("F6"), IOStandard(LVCMOS_BANK3)), # West button
-    # NET "btn<5>" LOC = "F5";  # Bank = 3, Pin name = IO_L55N_M3A14,        Sch name = BTNC
-    ("user_btn", 4, Pins("F5"), IOStandard(LVCMOS_BANK3)), # Center button
+    # Buttons
+    ("user_btn", 0, Pins("N4"), IOStandard("LVCMOS18")), # North button
+    ("user_btn", 1, Pins("P4"), IOStandard("LVCMOS18")), # East button
+    ("user_btn", 2, Pins("P3"), IOStandard("LVCMOS18")), # South button
+    ("user_btn", 3, Pins("F6"), IOStandard("LVCMOS18")), # West button
+    ("user_btn", 4, Pins("F5"), IOStandard("LVCMOS18")), # Center button
 
-    ## onBoard SWITCHES - FIXME
-    # SW(0,1,2,3) - VCC3V3 / GND
-    # SW(4,5,6) - VCCB2 / GND
-    # SW(7) - VCC1V8 / GND
-    # NET "sw<0>" LOC = "A10"; # Bank = 0, Pin name = IO_L37N_GCLK12,         Sch name = SW0
-    # NET "sw<1>" LOC = "D14"; # Bank = 0, Pin name = IO_L65P_SCP3,           Sch name = SW1
-    # NET "sw<2>" LOC = "C14"; # Bank = 0, Pin name = IO_L65N_SCP2,           Sch name = SW2
-    # NET "sw<3>" LOC = "P15"; # Bank = 1, Pin name = IO_L74P_AWAKE_1,        Sch name = SW3
-    # NET "sw<4>" LOC = "P12"; # Bank = 2, Pin name = IO_L13N_D10,            Sch name = SW4
-    # NET "sw<5>" LOC = "R5";  # Bank = 2, Pin name = IO_L48P_D7,             Sch name = SW5
-    # NET "sw<6>" LOC = "T5";  # Bank = 2, Pin name = IO_L48N_RDWR_B_VREF_2,  Sch name = SW6
-    # NET "sw<7>" LOC = "E4";  # Bank = 3, Pin name = IO_L54P_M3RESET,        Sch name = SW7
-    ("user_sw", 0, Pins("A10"), IOStandard(LVCMOS_BANK0)),
-    ("user_sw", 1, Pins("D14"), IOStandard(LVCMOS_BANK0)),
-    ("user_sw", 2, Pins("C14"), IOStandard(LVCMOS_BANK0)),
-    ("user_sw", 3, Pins("P15"), IOStandard(LVCMOS_BANK1)),
-    ("user_sw", 4, Pins("P12"), IOStandard(LVCMOS_BANK2)),
-    ("user_sw", 5, Pins("R5"),  IOStandard(LVCMOS_BANK2)),
-    ("user_sw", 6, Pins("T5"),  IOStandard(LVCMOS_BANK2)),
-    ("user_sw", 7, Pins("E4"),  IOStandard(LVCMOS_BANK3)),
+    # Switches.
+    ("user_sw", 0, Pins("A10"), IOStandard("LVCMOS33")),
+    ("user_sw", 1, Pins("D14"), IOStandard("LVCMOS33")),
+    ("user_sw", 2, Pins("C14"), IOStandard("LVCMOS33")),
+    ("user_sw", 3, Pins("P15"), IOStandard("LVCMOS33")),
+    ("user_sw", 4, Pins("P12"), IOStandard("LVCMOS33")),
+    ("user_sw", 5, Pins("R5"),  IOStandard("LVCMOS33")),
+    ("user_sw", 6, Pins("T5"),  IOStandard("LVCMOS33")),
+    ("user_sw", 7, Pins("E4"),  IOStandard("LVCMOS18")),
 
-    ## TEMAC Ethernet MAC - FIXME
-    # 10/100/1000 Ethernet PHY
-    # 88E111-B2-RCJ1-C000 - Marvell Alaska Tri-mode PHY (the 88E1111)
-    # paired with a Halo HFJ11-1G01E RJ-45 connector
-    # Runs from 1.2V power supply
+    # GMII/MII Ethernet
     ("eth_clocks", 0,
-        # NET "phytxclk"  LOC = "K16"; # Bank = 1, Pin name = IO_L41N_GCLK8_M1CASN,       Sch name = E-TXCLK
-        Subsignal("tx", Pins("K16")),
-        # NET "phygtxclk" LOC = "L12"; # Bank = 1, Pin name = IO_L40P_GCLK11_M1A5,        Sch name = E-GTXCLK
+        Subsignal("tx",  Pins("K16")),
         Subsignal("gtx", Pins("L12")),
-        # NET "phyrxclk"  LOC = "K15"; # Bank = 1, Pin name = IO_L41P_GCLK9_IRDY1_M1RASN, Sch name = E-RXCLK
-        Subsignal("rx", Pins("K15")),
-        IOStandard(LVCMOS_BANK1)
+        Subsignal("rx",  Pins("K15")),
+        IOStandard("LVCMOS33")
     ),
-
     ("eth", 0,
-        # NET "phyrst"    LOC = "G13"; # Bank = 1, Pin name = IO_L32N_A16_M1A9,    Sch name = E-RESET
-        Subsignal("rst_n", Pins("G13")),
-        # NET "phyint"    LOC = "L16"; # Bank = 1, Pin name = IO_L42N_GCLK6_TRDY1_M1LDM, Sch name = E-INT
-        Subsignal("int_n", Pins("L16")),
-        # NET "phymdi"    LOC = "N17"; # Bank = 1, Pin name = IO_L48P_HDC_M1DQ8,   Sch name = E-MDIO
-        Subsignal("mdio", Pins("N17")),
-        # NET "phymdc"    LOC = "F16"; # Bank = 1, Pin name = IO_L1N_A24_VREF,     Sch name = E-MDC
-        Subsignal("mdc", Pins("F16")),
-        # NET "phyrxdv"   LOC = "F17"; # Bank = 1, Pin name = IO_L35P_A11_M1A7,    Sch name = E-RXDV
-        Subsignal("rx_dv", Pins("F17")),
-        # NET "phyrxer"   LOC = "F18"; # Bank = 1, Pin name = IO_L35N_A10_M1A2,    Sch name = E-RXER
-        Subsignal("rx_er", Pins("F18")),
-        # NET "phyRXD<0>" LOC = "G16"; # Bank = 1, Pin name = IO_L38P_A5_M1CLK,    Sch name = E-RXD0
-        # NET "phyRXD<1>" LOC = "H14"; # Bank = 1, Pin name = IO_L36N_A8_M1BA1,    Sch name = E-RXD1
-        # NET "phyRXD<2>" LOC = "E16"; # Bank = 1, Pin name = IO_L33P_A15_M1A10,   Sch name = E-RXD2
-        # NET "phyRXD<3>" LOC = "F15"; # Bank = 1, Pin name = IO_L1P_A25,          Sch name = E-RXD3
-        # NET "phyRXD<4>" LOC = "F14"; # Bank = 1, Pin name = IO_L30P_A21_M1RESET, Sch name = E-RXD4
-        # NET "phyRXD<5>" LOC = "E18"; # Bank = 1, Pin name = IO_L33N_A14_M1A4,    Sch name = E-RXD5
-        # NET "phyRXD<6>" LOC = "D18"; # Bank = 1, Pin name = IO_L31N_A18_M1A12,   Sch name = E-RXD6
-        # NET "phyRXD<7>" LOC = "D17"; # Bank = 1, Pin name = IO_L31P_A19_M1CKE,   Sch name = E-RXD7
+        Subsignal("rst_n",   Pins("G13")),
+        Subsignal("int_n",   Pins("L16")),
+        Subsignal("mdio",    Pins("N17")),
+        Subsignal("mdc",     Pins("F16")),
+        Subsignal("rx_dv",   Pins("F17")),
+        Subsignal("rx_er",   Pins("F18")),
         Subsignal("rx_data", Pins("G16 H14 E16 F15 F14 E18 D18 D17")),
-        # NET "phytxen"   LOC = "H15"; # Bank = 1, Pin name = IO_L37P_A7_M1A0,     Sch name = E-TXEN
-        Subsignal("tx_en", Pins("H15")),
-        # NET "phytxer"   LOC = "G18"; # Bank = 1, Pin name = IO_L38N_A4_M1CLKN,   Sch name = E-TXER
-        Subsignal("tx_er", Pins("G18")),
-        # NET "phyTXD<0>" LOC = "H16"; # Bank = 1, Pin name = IO_L37N_A6_M1A1,     Sch name = E-TXD0
-        # NET "phyTXD<1>" LOC = "H13"; # Bank = 1, Pin name = IO_L36P_A9_M1BA0,    Sch name = E-TXD1
-        # NET "phyTXD<2>" LOC = "K14"; # Bank = 1, Pin name = IO_L39N_M1ODT,       Sch name = E-TXD2
-        # NET "phyTXD<3>" LOC = "K13"; # Bank = 1, Pin name = IO_L34N_A12_M1BA2,   Sch name = E-TXD3
-        # NET "phyTXD<4>" LOC = "J13"; # Bank = 1, Pin name = IO_L39P_M1A3,        Sch name = E-TXD4
-        # NET "phyTXD<5>" LOC = "G14"; # Bank = 1, Pin name = IO_L30N_A20_M1A11,   Sch name = E-TXD5
-        # NET "phyTXD<6>" LOC = "H12"; # Bank = 1, Pin name = IO_L32P_A17_M1A8,    Sch name = E-TXD6
-        # NET "phyTXD<7>" LOC = "K12"; # Bank = 1, Pin name = IO_L34P_A13_M1WE,    Sch name = E-TXD7
+        Subsignal("tx_en",   Pins("H15")),
+        Subsignal("tx_er",   Pins("G18")),
         Subsignal("tx_data", Pins("H16 H13 K14 K13 J13 G14 H12 K12")),
-        # C17 - from Atlys reference manual, not listed in UCF file?
-        Subsignal("col", Pins("C17")),
-        # C18 - from Atlys reference manual, not listed in UCF file?
-        Subsignal("crs", Pins("C18")),
-        IOStandard(LVCMOS_BANK1)
+        Subsignal("col",     Pins("C17")),
+        Subsignal("crs",     Pins("C18")),
+        IOStandard("LVCMOS33")
     ),
 
-    ## DDR2
-    # 128Mbyte DDR2 16-bit wide data @ 800MHz
-    # Older boards - MT47H64M16HR-25E - DDR2 - 2.5ns @ CL = 5 (DDR2-800)
-    # Newer boards - MIRA P3R1GE3EGF G8E DDR2 -
-    #
-    # The interface supports SSTL18 signaling. Address and control signals
-    # are terminated through 47-ohm resistors to a 0.9V VTT, and data
-    # signals use the On-Die-Termination (ODT) feature of the DDR2 chip.
-    #
-    # When generating a MIG core for the MIRA part, selecting the
-    # “EDE1116AXXX-8E” device will result in the correct timing parameters
-    # being set. When generating a component for the Micron part, it can be
-    # selected by name within the wizard. The part loaded on your Atlys can
-    # be determined by examining the print on the DDR2 component (IC13).
-    #
-    # NET "DDR2CLK0"   LOC = "G3"; # Bank = 3, Pin name = IO_L46P_M3CLK,               Sch name = DDR-CK_P
-    # NET "DDR2CLK1"   LOC = "G1"; # Bank = 3, Pin name = IO_L46N_M3CLKN,              Sch name = DDR-CK_N
+    # DDR2 SDRAM.
     ("ddram_clock", 0,
         Subsignal("p", Pins("G3")),
         Subsignal("n", Pins("G1")),
         IOStandard("DIFF_SSTL18_II"), Misc("IN_TERM=NONE")
     ),
     ("ddram", 0,
-        # NET "DDR2CKE"    LOC = "H7"; # Bank = 3, Pin name = IO_L53P_M3CKE,           Sch name = DDR-CKE
-        Subsignal("cke", Pins("H7"), IOStandard("SSTL18_II")),
-        # NET "DDR2RASN"   LOC = "L5"; # Bank = 3, Pin name = IO_L43P_GCLK23_M3RASN,   Sch name = DDR-RAS
+        Subsignal("cke",   Pins("H7"), IOStandard("SSTL18_II")),
         Subsignal("ras_n", Pins("L5"), IOStandard("SSTL18_II")),
-        # NET "DDR2CASN"   LOC = "K5"; # Bank = 3, Pin name = IO_L43N_GCLK22_IRDY2_M3CASN, Sch name = DDR-CAS
         Subsignal("cas_n", Pins("K5"), IOStandard("SSTL18_II")),
-        # NET "DDR2WEN"    LOC = "E3"; # Bank = 3, Pin name = IO_L50P_M3WE,         Sch name = DDR-WE
-        Subsignal("we_n", Pins("E3"), IOStandard("SSTL18_II")),
-
-        # NET "DDR2BA0"    LOC = "F2"; # Bank = 3, Pin name = IO_L48P_M3BA0,        Sch name = DDR-BA0
-        # NET "DDR2BA1"    LOC = "F1"; # Bank = 3, Pin name = IO_L48N_M3BA1,        Sch name = DDR-BA1
-        # NET "DDR2BA2"    LOC = "E1"; # Bank = 3, Pin name = IO_L50N_M3BA2,        Sch name = DDR-BA2
-        Subsignal("ba", Pins("F2 F1 E1"), IOStandard("SSTL18_II")),
-
-        # NET "DDR2A0"     LOC = "J7"; # Bank = 3, Pin name = IO_L47P_M3A0,         Sch name = DDR-A0
-        # NET "DDR2A1"     LOC = "J6"; # Bank = 3, Pin name = IO_L47N_M3A1,         Sch name = DDR-A1
-        # NET "DDR2A2"     LOC = "H5"; # Bank = 3, Pin name = IO_L49N_M3A2,         Sch name = DDR-A2
-        # NET "DDR2A3"     LOC = "L7"; # Bank = 3, Pin name = IO_L45P_M3A3,         Sch name = DDR-A3
-        # NET "DDR2A4"     LOC = "F3"; # Bank = 3, Pin name = IO_L51N_M3A4,         Sch name = DDR-A4
-        # NET "DDR2A5"     LOC = "H4"; # Bank = 3, Pin name = IO_L44P_GCLK21_M3A5,  Sch name = DDR-A5
-        # NET "DDR2A6"     LOC = "H3"; # Bank = 3, Pin name = IO_L44N_GCLK20_M3A6,  Sch name = DDR-A6
-        # NET "DDR2A7"     LOC = "H6"; # Bank = 3, Pin name = IO_L49P_M3A7,         Sch name = DDR-A7
-        # NET "DDR2A8"     LOC = "D2"; # Bank = 3, Pin name = IO_L52P_M3A8,         Sch name = DDR-A8
-        # NET "DDR2A9"     LOC = "D1"; # Bank = 3, Pin name = IO_L52N_M3A9,         Sch name = DDR-A9
-        # NET "DDR2A10"    LOC = "F4"; # Bank = 3, Pin name = IO_L51P_M3A10,        Sch name = DDR-A10
-        # NET "DDR2A11"    LOC = "D3"; # Bank = 3, Pin name = IO_L54N_M3A11,        Sch name = DDR-A11
-        # NET "DDR2A12"    LOC = "G6"; # Bank = 3, Pin name = IO_L53N_M3A12,        Sch name = DDR-A12
-        Subsignal("a", Pins("J7 J6 H5 L7 F3 H4 H3 H6 D2 D1 F4 D3 G6"), IOStandard("SSTL18_II")),
-        # NET "DDR2DQ0"    LOC = "L2"; # Bank = 3, Pin name = IO_L37P_M3DQ0,        Sch name = DDR-DQ0
-        # NET "DDR2DQ1"    LOC = "L1"; # Bank = 3, Pin name = IO_L37N_M3DQ1,        Sch name = DDR-DQ1
-        # NET "DDR2DQ2"    LOC = "K2"; # Bank = 3, Pin name = IO_L38P_M3DQ2,        Sch name = DDR-DQ2
-        # NET "DDR2DQ3"    LOC = "K1"; # Bank = 3, Pin name = IO_L38N_M3DQ3,        Sch name = DDR-DQ3
-        # NET "DDR2DQ4"    LOC = "H2"; # Bank = 3, Pin name = IO_L41P_GCLK27_M3DQ4, Sch name = DDR-DQ4
-        # NET "DDR2DQ5"    LOC = "H1"; # Bank = 3, Pin name = IO_L41N_GCLK26_M3DQ5, Sch name = DDR-DQ5
-        # NET "DDR2DQ6"    LOC = "J3"; # Bank = 3, Pin name = IO_L40P_M3DQ6,        Sch name = DDR-DQ6
-        # NET "DDR2DQ7"    LOC = "J1"; # Bank = 3, Pin name = IO_L40N_M3DQ7,        Sch name = DDR-DQ7
-        # NET "DDR2DQ8"    LOC = "M3"; # Bank = 3, Pin name = IO_L36P_M3DQ8,        Sch name = DDR-DQ8
-        # NET "DDR2DQ9"    LOC = "M1"; # Bank = 3, Pin name = IO_L36N_M3DQ9,        Sch name = DDR-DQ9
-        # NET "DDR2DQ10"   LOC = "N2"; # Bank = 3, Pin name = IO_L35P_M3DQ10,       Sch name = DDR-DQ10
-        # NET "DDR2DQ11"   LOC = "N1"; # Bank = 3, Pin name = IO_L35N_M3DQ11,       Sch name = DDR-DQ11
-        # NET "DDR2DQ12"   LOC = "T2"; # Bank = 3, Pin name = IO_L33P_M3DQ12,       Sch name = DDR-DQ12
-        # NET "DDR2DQ13"   LOC = "T1"; # Bank = 3, Pin name = IO_L33N_M3DQ13,       Sch name = DDR-DQ13
-        # NET "DDR2DQ14"   LOC = "U2"; # Bank = 3, Pin name = IO_L32P_M3DQ14,       Sch name = DDR-DQ14
-        # NET "DDR2DQ15"   LOC = "U1"; # Bank = 3, Pin name = IO_L32N_M3DQ15,       Sch name = DDR-DQ15
+        Subsignal("we_n",  Pins("E3"), IOStandard("SSTL18_II")),
+        Subsignal("ba",    Pins("F2 F1 E1"), IOStandard("SSTL18_II")),
+        Subsignal("a", Pins(
+            "J7 J6 H5 L7 F3 H4 H3 H6",
+            "D2 D1 F4 D3 G6"),
+            IOStandard("SSTL18_II")),
         Subsignal("dq", Pins(
-                    "L2 L1 K2 K1 H2 H1 J3 J1",
-                    "M3 M1 N2 N1 T2 T1 U2 U1"), IOStandard("SSTL18_II")),
-        # U == Upper, L == Lower
-        # NET "DDR2UDQS"   LOC="P2"; # Bank = 3, Pin name = IO_L34P_M3UDQS,         Sch name = DDR-UDQS_P
-        # NET "DDR2UDQSN"  LOC="P1"; # Bank = 3, Pin name = IO_L34N_M3UDQSN,        Sch name = DDR-UDQS_N
-        # NET "DDR2LDQS"   LOC="L4"; # Bank = 3, Pin name = IO_L39P_M3LDQS,         Sch name = DDR-LDQS_P
-        # NET "DDR2LDQSN"  LOC="L3"; # Bank = 3, Pin name = IO_L39N_M3LDQSN,        Sch name = DDR-LDQS_N
-        Subsignal("dqs", Pins("P2 L4"), IOStandard("DIFF_SSTL18_II")),
+            "L2 L1 K2 K1 H2 H1 J3 J1",
+            "M3 M1 N2 N1 T2 T1 U2 U1"),
+            IOStandard("SSTL18_II")),
+        Subsignal("dqs",   Pins("P2 L4"), IOStandard("DIFF_SSTL18_II")),
         Subsignal("dqs_n", Pins("P1 L3"), IOStandard("DIFF_SSTL18_II")),
-        # NET "DDR2UDM"    LOC="K4"; # Bank = 3, Pin name = IO_L42P_GCLK25_TRDY2_M3UDM, Sch name = DDR-UDM
-        # NET "DDR2LDM"    LOC="K3"; # Bank = 3, Pin name = IO_L42N_GCLK24_M3LDM,   Sch name = DDR-LDM
-        Subsignal("dm", Pins("K4 K3"), IOStandard("SSTL18_II")),
-        # NET "DDR2ODT"    LOC="K6"; # Bank = 3, Pin name = IO_L45N_M3ODT,          Sch name = DDR-ODT
-        Subsignal("odt", Pins("K6"), IOStandard("SSTL18_II"))
+        Subsignal("dm",    Pins("K4 K3"), IOStandard("SSTL18_II")),
+        Subsignal("odt",   Pins("K6"),    IOStandard("SSTL18_II"))
     ),
 
-    ## onboard HDMI OUT
-    # Type A connector, marked as J2 on the board, next to the power connector.
-    # Buffered / protected with TMDS141RHAR
-    # NET "HDMIOUTCLKP" LOC = "B6"; # Bank = 0, Pin name = IO_L8P,         Sch name = TMDS-TX-CLK_P
-    # NET "HDMIOUTCLKN" LOC = "A6"; # Bank = 0, Pin name = IO_L8N_VREF,    Sch name = TMDS-TX-CLK_N
-    # NET "HDMIOUTD0P"  LOC = "D8"; # Bank = 0, Pin name = IO_L11P,        Sch name = TMDS-TX-0_P
-    # NET "HDMIOUTD0N"  LOC = "C8"; # Bank = 0, Pin name = IO_L11N,        Sch name = TMDS-TX-0_N
-    # NET "HDMIOUTD1P"  LOC = "C7"; # Bank = 0, Pin name = IO_L10P,        Sch name = TMDS-TX-1_P
-    # NET "HDMIOUTD1N"  LOC = "A7"; # Bank = 0, Pin name = IO_L10N,        Sch name = TMDS-TX-1_N
-    # NET "HDMIOUTD2P"  LOC = "B8"; # Bank = 0, Pin name = IO_L33P,        Sch name = TMDS-TX-2_P
-    # NET "HDMIOUTD2N"  LOC = "A8"; # Bank = 0, Pin name = IO_L33N,        Sch name = TMDS-TX-2_N
-    # NET "HDMIOUTSCL"  LOC = "D9"; # Bank = 0, Pin name = IO_L34P_GCLK19, Sch name = TMDS-TX-SCL
-    # NET "HDMIOUTSDA"  LOC = "C9"; # Bank = 0, Pin name = IO_L34N_GCLK18, Sch name = TMDS-TX-SDA
+    # HDMI Out 0
     ("hdmi_out", 0,
-        Subsignal("clk_p", Pins("B6"), IOStandard("TMDS_33")),
-        Subsignal("clk_n", Pins("A6"), IOStandard("TMDS_33")),
+        Subsignal("clk_p",   Pins("B6"), IOStandard("TMDS_33")),
+        Subsignal("clk_n",   Pins("A6"), IOStandard("TMDS_33")),
         Subsignal("data0_p", Pins("D8"), IOStandard("TMDS_33")),
         Subsignal("data0_n", Pins("C8"), IOStandard("TMDS_33")),
         Subsignal("data1_p", Pins("C7"), IOStandard("TMDS_33")),
         Subsignal("data1_n", Pins("A7"), IOStandard("TMDS_33")),
         Subsignal("data2_p", Pins("B8"), IOStandard("TMDS_33")),
         Subsignal("data2_n", Pins("A8"), IOStandard("TMDS_33")),
-        # Disconnect JP6 and JP7 for FPGA SCL/SDA control, otherwise
-        # this is connected to J3's SCL/SDA pins.
-        Subsignal("scl", Pins("D9"), IOStandard("I2C")),
-        Subsignal("sda", Pins("C9"), IOStandard("I2C")),
+        Subsignal("scl",     Pins("D9"), IOStandard("I2C")),
+        Subsignal("sda",     Pins("C9"), IOStandard("I2C")),
     ),
 
-    ## onboard HDMI IN1 (PMODA)
-    # Type A connector, marked as J1, on side with USB connectors.
-    # Buffered / protected with TMDS141RHAR
-    # JP4 connects / disconnects 5V to HDMI pin 18, for input to work make
-    # sure it is connected.
-    # NET "HDMIIN1CLKP" LOC = "D11"; # Bank = 0, Pin name = IO_L36P_GCLK15, Sch name = TMDS-RXB-CLK_P
-    # NET "HDMIIN1CLKN" LOC = "C11"; # Bank = 0, Pin name = IO_L36N_GCLK14, Sch name = TMDS-RXB-CLK_N
-    # NET "HDMIIN1D0P"  LOC = "G9";  # Bank = 0, Pin name = IO_L38P,        Sch name = TMDS-RXB-0_P
-    # NET "HDMIIN1D0N"  LOC = "F9";  # Bank = 0, Pin name = IO_L38N_VREF,   Sch name = TMDS-RXB-0_N
-    # NET "HDMIIN1D1P"  LOC = "B11"; # Bank = 0, Pin name = IO_L39P,        Sch name = TMDS-RXB-1_P
-    # NET "HDMIIN1D1N"  LOC = "A11"; # Bank = 0, Pin name = O_L39N,         Sch name = TMDS-RXB-1_N
-    # NET "HDMIIN1D2P"  LOC = "B12"; # Bank = 0, Pin name = IO_L41P,        Sch name = TMDS-RXB-2_P
-    # NET "HDMIIN1D2N"  LOC = "A12"; # Bank = 0, Pin name = IO_L41N,        Sch name = TMDS-RXB-2_N
-    # NET "HDMIIN1SCL"  LOC = "C13"; # Bank = 0, Pin name = IO_L50P,        Sch name = PMOD-SCL
-    # NET "HDMIIN1SDA"  LOC = "A13"; # Bank = 0, Pin name = IO_L50N,        Sch name = PMOD-SDA
+    # HDMI In 0
     ("hdmi_in", 0,
-        Subsignal("clk_p", Pins("D11")),
-        Subsignal("clk_n", Pins("C11")),
+        Subsignal("clk_p",   Pins("D11")),
+        Subsignal("clk_n",   Pins("C11")),
         Subsignal("data0_p", Pins("G9")),
         Subsignal("data0_n", Pins("F9")),
         Subsignal("data1_p", Pins("B11")),
         Subsignal("data1_n", Pins("A11")),
         Subsignal("data2_p", Pins("B12")),
         Subsignal("data2_n", Pins("A12")),
-        # Make sure JP2 is connected. Shared with J1.
-        Subsignal("scl", Pins("C13"), IOStandard(LVCMOS_BANK0)),
-        Subsignal("sda", Pins("A13"), IOStandard(LVCMOS_BANK0)),
-        #Subsignal("hpd_notif", Pins("G22"), IOStandard("LVCMOS33")),
-        #Subsignal("hpd_en", Pins("G17"), IOStandard("LVCMOS33"))
+        Subsignal("scl",     Pins("C13"), IOStandard("LVCMOS33")),
+        Subsignal("sda",     Pins("A13"), IOStandard("LVCMOS33")),
     ),
 
-    ## onboard HDMI IN2
-    # Type A connector, marked as J3, between audio connectors and Ethernet
-    # RJ45 connector.
-    # Buffered / protected with a TMDS141RHAR
-    # JP8 connects / disconnects 5V to HDMI pin 18, for input to work make
-    # sure it is connected.
-    # NET "HDMIIN2CLKP" LOC = "H17"; # Bank = 1, Pin name = IO_L43P_GCLK5_M1DQ4, Sch name = TMDS-RX-CLK_P
-    # NET "HDMIIN2CLKN" LOC = "H18"; # Bank = 1, Pin name = IO_L43N_GCLK4_M1DQ5, Sch name = TMDS-RX-CLK_N
-    # NET "HDMIIN2D0P"  LOC = "K17"; # Bank = 1, Pin name = IO_L45P_A1_M1LDQS,   Sch name = TMDS-RX-0_P
-    # NET "HDMIIN2D0N"  LOC = "K18"; # Bank = 1, Pin name = IO_L45N_A0_M1LDQSN,  Sch name = TMDS-RX-0_N
-    # NET "HDMIIN2D1P"  LOC = "L17"; # Bank = 1, Pin name = IO_L46P_FCS_B_M1DQ2, Sch name = TMDS-RX-1_P
-    # NET "HDMIIN2D1N"  LOC = "L18"; # Bank = 1, Pin name = IO_L46N_FOE_B_M1DQ3, Sch name = TMDS-RX-1_N
-    # NET "HDMIIN2D2P"  LOC = "J16"; # Bank = 1, Pin name = IO_L44P_A3_M1DQ6,    Sch name = TMDS-RX-2_P
-    # NET "HDMIIN2D2N"  LOC = "J18"; # Bank = 1, Pin name = IO_L44N_A2_M1DQ7,    Sch name = TMDS-RX-2_N
-    # NET "HDMIIN2SCL"  LOC = "M16"; # Bank = 1, Pin name = IO_L47P_FWE_B_M1DQ0, Sch name = TMDS-RX-SCL
-    # NET "HDMIIN2SDA"  LOC = "M18"; # Bank = 1, Pin name = IO_L47N_LDC_M1DQ1,   Sch name = TMDS-RX-SDA
+    # HDMI In 1
     ("hdmi_in", 1,
-        Subsignal("clk_p", Pins("H17")),
-        Subsignal("clk_n", Pins("H18")),
+        Subsignal("clk_p",   Pins("H17")),
+        Subsignal("clk_n",   Pins("H18")),
         Subsignal("data0_p", Pins("K17")),
         Subsignal("data0_n", Pins("K18")),
         Subsignal("data1_p", Pins("L17")),
         Subsignal("data1_n", Pins("L18")),
         Subsignal("data2_p", Pins("J16")),
         Subsignal("data2_n", Pins("J18")),
-        # Disconnect JP6 and JP7 for FPGA SCL/SDA control, otherwise
-        # this is connected to J2's SCL/SDA pins.
-        Subsignal("scl", Pins("M16"), IOStandard(LVCMOS_BANK1)),
-        Subsignal("sda", Pins("M18"), IOStandard(LVCMOS_BANK1)),
-        #Subsignal("hpd_notif", Pins("G16"), IOStandard("LVCMOS33")),
-        #Subsignal("hpd_en", Pins("B20"), IOStandard("LVCMOS33"))
-    ),
-
-    ## onboard USB Host Controller - FIXME
-    # PIC32MX440F256H-40I/MR
-    # USB-HID port (for mouse/keyboard)
-    # PS/2 Keyboard - K_CLK - P17
-    # PS/2 Keyboard - K_DAT - N15
-    # PS/2 Mouse - M_CLK - N18
-    # PS/2 Mouse - M_DAT - P18
-    # FPGA Serial programming - DIN - R13
-    # FPGA Serial programming - CLK - R15
-    # NET "USBCLK" LOC = "P17"; # Bank = 1, Pin name = IO_L49P_M1DQ10, Sch name = PIC32-SCK1
-    # NET "USBSDI" LOC = "N15"; # Bank = 1, Pin name = IO_L50P_M1UDQS, Sch name = PIC32-SDI1
-
-    # NET "USBSS"  LOC = "P18"; # Bank = 1, Pin name = IO_L49N_M1DQ11, Sch name = PIC32-SS1
-    # NET "USBSDO" LOC = "N18"; # Bank = 1, Pin name = IO_L48N_M1DQ9,  Sch name = PIC32-SDO1
-
-    ## Audio - FIXME
-    # National Semiconductor - LM4550VH
-    # AC-97 Codec with line-in, line-out, mic, & headphone
-    # Audio
-    # NET "BITCLK"   LOC = "L13"; # Bank = 1, Pin name = IO_L40N_GCLK10_M1A6, Sch name = AUD-BIT-CLK
-    # NET "AUDSYNC"  LOC = "U17"; # Bank = 1, Pin name = IO_L52P_M1DQ14,      Sch name = AUD-SYNC
-    # NET "AUDRST"   LOC = "T17"; # Bank = 1, Pin name = IO_L51P_M1DQ12,      Sch name = AUD-RESET
-    # NET "AUDSDI"   LOC = "T18"; # Bank = 1, Pin name = IO_L51N_M1DQ13,      Sch name = AUD-SDI
-    # NET "AUDSDO"   LOC = "N16"; # Bank = 1, Pin name = IO_L50N_M1UDQSN,     Sch name = AUD-SDO
-
-    ## USB UART Connector
-    # USB Micro B port marked as UART between HDMI connector and USB A connector.
-    # XR21V1410IL16 - Vizzini USB Serial - https://github.com/shenki/exar-uart-driver
-    # NET "UartRx" LOC = "A16"; # Bank = 0, Pin name = IO_L66N_SCP0, Sch name = USBB-RXD
-    # NET "UartTx" LOC = "B16"; # Bank = 0, Pin name = IO_L66P_SCP1, Sch name = USBB-TXD
-    ("serial", 0,
-        Subsignal("rx", Pins("A16"), IOStandard("LVCMOS33")),
-        Subsignal("tx", Pins("B16"), IOStandard("LVCMOS33")),
-    ),
-
-#        ("fpga_cfg",
-#            Subsignal("din", Pins("T14")),
-#            Subsignal("cclk", Pins("R14")),
-#            Subsignal("init_b", Pins("T12")),
-#            Subsignal("prog_b", Pins("A2")),
-#            Subsignal("done", Pins("T15")),
-#        ),
-#        ("jtag",
-#            Subsignal("tms", Pins("B2")),
-#            Subsignal("tdo", Pins("B16")),
-#            Subsignal("tdi", Pins("B1")),
-#            Subsignal("tck", Pins("A15")),
-#        ),
-
-]
-
-# This Micro-D HDMI connector only works when VCCB2 is set to 3V3.
-_io_vccb2_3v3 = [
-    ## PMOD Connector
-    # Micro-D connector, marked as JB, on the same side as switches + LEDs
-    # but on the underside of the board below MOD connector. Works as
-    # either output or input because it isn't buffered. Also often referred
-    # to as "JA".
-    # JP12 connects VCC to 3.3V or 2.5V, make sure 3.3V is selected.
-    # JP3 connects / disconnects 5V to HDMI pin 19.
-    #  * To use as output, remove the jumper.
-    #  * To use as input, make sure it is connected.
-    # NET "JB<5>"  LOC = "T9"; # Bank = 2,  Pin name = IO_L32P_GCLK29, Sch name = JA-CLK_P
-    # NET "JB<4>"  LOC = "V9"; # Bank = 2,  Pin name = IO_L32N_GCLK28, Sch name = JA-CLK_N
-    # NET "JB<1>"  LOC = "R3"; # Bank = 2,  Pin name = IO_L62P_D5,     Sch name = JA-D0_P
-    # NET "JB<0>"  LOC = "T3"; # Bank = 2,  Pin name = IO_L62N_D6,     Sch name = JA-D0_N
-    # NET "JB<7>"  LOC = "T4"; # Bank = 2,  Pin name = IO_L63P,        Sch name = JA-D1_P
-    # NET "JB<6>"  LOC = "V4"; # Bank = 2,  Pin name = IO_L63N,        Sch name = JA-D1_N
-    # NET "JB<3>"  LOC = "N5"; # Bank = 2,  Pin name = IO_L64P_D8,     Sch name = JA-D2_P
-    # NET "JB<2>"  LOC = "P6"; # Bank = 2,  Pin name = IO_L64N_D9,     Sch name = JA-D2_N
-    ("hdmi_out", 1,
-        Subsignal("clk_p", Pins("T9"), IOStandard("TMDS_33")),
-        Subsignal("clk_n", Pins("V9"), IOStandard("TMDS_33")),
-        Subsignal("data0_p", Pins("R3"), IOStandard("TMDS_33")),
-        Subsignal("data0_n", Pins("T3"), IOStandard("TMDS_33")),
-        Subsignal("data1_p", Pins("T4"), IOStandard("TMDS_33")),
-        Subsignal("data1_n", Pins("V4"), IOStandard("TMDS_33")),
-        Subsignal("data2_p", Pins("N5"), IOStandard("TMDS_33")),
-        Subsignal("data2_n", Pins("P6"), IOStandard("TMDS_33")),
-        # Make sure JP2 is connected. Shared with JA.
-        #Subsignal("scl", Pins("C13"), IOStandard("LVCMOS33")),
-        #Subsignal("sda", Pins("A13"), IOStandard("LVCMOS33")),
+        Subsignal("scl",     Pins("M16"), IOStandard("LVCMOS33")),
+        Subsignal("sda",     Pins("M18"), IOStandard("LVCMOS33")),
     ),
 ]
 
-_io_vccb2_2v5 = []
+# Connectors ---------------------------------------------------------------------------------------
 
 _connectors = [
-    ## onboard VHDCI - FIXME
-    # Can either run at 2.5V or 3.3V dependent on JP12 connector.
-    # Channel 1 connects to P signals, Channel 2 to N signals
-    # NET "VHDCIIO1<0>"  LOC = "U16"; # Bank = 2,  Pin name = IO_L2P_CMPCLK,      Sch name = EXP-IO1_P
-    # NET "VHDCIIO1<1>"  LOC = "U15"; # Bank = 2,  Pin name = *IO_L5P,            Sch name = EXP-IO2_P
-    # NET "VHDCIIO1<2>"  LOC = "U13"; # Bank = 2,  Pin name = IO_L14P_D11,        Sch name = EXP-IO3_P
-    # NET "VHDCIIO1<3>"  LOC = "M11"; # Bank = 2,  Pin name = *IO_L15P,           Sch name = EXP-IO4_P
-    # NET "VHDCIIO1<4>"  LOC = "R11"; # Bank = 2,  Pin name = IO_L16P,            Sch name = EXP-IO5_P
-    # NET "VHDCIIO1<5>"  LOC = "T12"; # Bank = 2,  Pin name = *IO_L19P,           Sch name = EXP-IO6_P
-    # NET "VHDCIIO1<6>"  LOC = "N10"; # Bank = 2,  Pin name = *IO_L20P,           Sch name = EXP-IO7_P
-    # NET "VHDCIIO1<7>"  LOC = "M10"; # Bank = 2,  Pin name = *IO_L22P,           Sch name = EXP-IO8_P
-    # NET "VHDCIIO1<8>"  LOC = "U11"; # Bank = 2,  Pin name = IO_L23P,            Sch name = EXP-IO9_P
-    # NET "VHDCIIO1<9>"  LOC = "R10"; # Bank = 2,  Pin name = IO_L29P_GCLK3,      Sch name = EXP-IO10_P
-    # NET "VHDCIIO1<10>" LOC = "U10"; # Bank = 2,  Pin name = IO_L30P_GCLK1_D13,  Sch name = EXP-IO11_P
-    # NET "VHDCIIO1<11>" LOC = "R8";  # Bank = 2,  Pin name = IO_L31P_GCLK31_D14, Sch name = EXP-IO12_P
-    # NET "VHDCIIO1<12>" LOC = "M8";  # Bank = 2,  Pin name = *IO_L40P,           Sch name = EXP-IO13_P
-    # NET "VHDCIIO1<13>" LOC = "U8";  # Bank = 2,  Pin name = IO_L41P,            Sch name = EXP-IO14_P
-    # NET "VHDCIIO1<14>" LOC = "U7";  # Bank = 2,  Pin name = IO_L43P,            Sch name = EXP-IO15_P
-    # NET "VHDCIIO1<15>" LOC = "N7";  # Bank = 2,  Pin name = *IO_L44P,           Sch name = EXP-IO16_P
-    # NET "VHDCIIO1<16>" LOC = "T6";  # Bank = 2,  Pin name = IO_L45P,            Sch name = EXP-IO17_P
-    # NET "VHDCIIO1<17>" LOC = "R7";  # Bank = 2,  Pin name = IO_L46P,            Sch name = EXP-IO18_P
-    # NET "VHDCIIO1<18>" LOC = "N6";  # Bank = 2,  Pin name = *IO_L47P,           Sch name = EXP-IO19_P
-    # NET "VHDCIIO1<19>" LOC = "U5";  # Bank = 2,  Pin name = IO_49P_D3,          Sch name = EXP-IO20_P
-    # --
-    # NET "VHDCIIO2<0>"  LOC = "V16"; # Bank = 2,  Pin name = IO_L2N_CMPMOSI,     Sch name = EXP-IO1_N
-    # NET "VHDCIIO2<1>"  LOC = "V15"; # Bank = 2,  Pin name = *IO_L5N,            Sch name = EXP-IO2_N
-    # NET "VHDCIIO2<2>"  LOC = "V13"; # Bank = 2,  Pin name = IO_L14N_D12,        Sch name = EXP-IO3_N
-    # NET "VHDCIIO2<3>"  LOC = "N11"; # Bank = 2,  Pin name = *IO_L15N,           Sch name = EXP-IO4_N
-    # NET "VHDCIIO2<4>"  LOC = "T11"; # Bank = 2,  Pin name = IO_L16N_VREF,       Sch name = EXP-IO5_N
-    # NET "VHDCIIO2<5>"  LOC = "V12"; # Bank = 2,  Pin name = *IO_L19N,           Sch name = EXP-IO6_N
-    # NET "VHDCIIO2<6>"  LOC = "P11"; # Bank = 2,  Pin name = *IO_L20N,           Sch name = EXP-IO7_N
-    # NET "VHDCIIO2<7>"  LOC = "N9";  # Bank = 2,  Pin name = *IO_L22N,           Sch name = EXP-IO8_N
-    # NET "VHDCIIO2<8>"  LOC = "V11"; # Bank = 2,  Pin name = IO_L23N,            Sch name = EXP-IO9_N
-    # NET "VHDCIIO2<9>"  LOC = "T10"; # Bank = 2,  Pin name = IO_L29N_GCLK2,      Sch name = EXP-IO10_N
-    # NET "VHDCIIO2<10>" LOC = "V10"; # Bank = 2,  Pin name = IO_L30N_GCLK0_USERCCLK, Sch name = EXP-IO11_N
-    # NET "VHDCIIO2<11>" LOC = "T8";  # Bank = 2,  Pin name = IO_L31N_GCLK30_D15, Sch name = EXP-IO12_N
-    # NET "VHDCIIO2<12>" LOC = "N8";  # Bank = 2,  Pin name = *IO_L40N,           Sch name = EXP-IO13_N
-    # NET "VHDCIIO2<13>" LOC = "V8";  # Bank = 2,  Pin name = IO_L41N_VREF,       Sch name = EXP-IO14_N
-    # NET "VHDCIIO2<14>" LOC = "V7";  # Bank = 2,  Pin name = IO_L43N,            Sch name = EXP-IO15_N
-    # NET "VHDCIIO2<15>" LOC = "P8";  # Bank = 2,  Pin name = *IO_L44N,           Sch name = EXP-IO16_N
-    # NET "VHDCIIO2<16>" LOC = "V6";  # Bank = 2,  Pin name = IO_L45N,            Sch name = EXP-IO17_N
-    # NET "VHDCIIO2<17>" LOC = "T7";  # Bank = 2,  Pin name = IO_L46N,            Sch name = EXP-IO18_N
-    # NET "VHDCIIO2<18>" LOC = "P7";  # Bank = 2,  Pin name = *IO_L47N,           Sch name = EXP-IO19_N
-    # NET "VHDCIIO2<19>" LOC = "V5";  # Bank = 2,  Pin name = IO_49N_D4,          Sch name = EXP-IO20_N
     ("VHDCI",
         {
-        "EXP-IO1_P": "U16",
-        "EXP-IO2_P": "U15",
-        "EXP-IO3_P": "U13",
-        "EXP-IO4_P": "M11",
-        "EXP-IO5_P": "R11",
-        "EXP-IO6_P": "T12",
-        "EXP-IO7_P": "N10",
-        "EXP-IO8_P": "M10",
-        "EXP-IO9_P": "U11",
-        "EXP-IO10_P": "R10",
-        "EXP-IO11_P": "U10",
-        "EXP-IO12_P": "R8",
-        "EXP-IO13_P": "M8",
-        "EXP-IO14_P": "U8",
-        "EXP-IO15_P": "U7",
-        "EXP-IO16_P": "N7",
-        "EXP-IO17_P": "T6",
-        "EXP-IO18_P": "R7",
-        "EXP-IO19_P": "N6",
-        "EXP-IO20_P": "U5",
-        "EXP-IO1_N": "V16",
-        "EXP-IO2_N": "V15",
-        "EXP-IO3_N": "V13",
-        "EXP-IO4_N": "N11",
-        "EXP-IO5_N": "T11",
-        "EXP-IO6_N": "V12",
-        "EXP-IO7_N": "P11",
-        "EXP-IO8_N": "N9",
-        "EXP-IO9_N": "V11",
-        "EXP-IO10_N": "T10",
-        "EXP-IO11_N": "V10",
-        "EXP-IO12_N": "T8",
-        "EXP-IO13_N": "N8",
-        "EXP-IO14_N": "V8",
-        "EXP-IO15_N": "V7",
-        "EXP-IO16_N": "P8",
-        "EXP-IO17_N": "V6",
-        "EXP-IO18_N": "T7",
-        "EXP-IO19_N": "P7",
-        "EXP-IO20_N": "V5",
+        "EXP-IO1_P"  : "U16",
+        "EXP-IO2_P"  : "U15",
+        "EXP-IO3_P"  : "U13",
+        "EXP-IO4_P"  : "M11",
+        "EXP-IO5_P"  : "R11",
+        "EXP-IO6_P"  : "T12",
+        "EXP-IO7_P"  : "N10",
+        "EXP-IO8_P"  : "M10",
+        "EXP-IO9_P"  : "U11",
+        "EXP-IO10_P" : "R10",
+        "EXP-IO11_P" : "U10",
+        "EXP-IO12_P" :  "R8",
+        "EXP-IO13_P" :  "M8",
+        "EXP-IO14_P" :  "U8",
+        "EXP-IO15_P" :  "U7",
+        "EXP-IO16_P" :  "N7",
+        "EXP-IO17_P" :  "T6",
+        "EXP-IO18_P" :  "R7",
+        "EXP-IO19_P" :  "N6",
+        "EXP-IO20_P" :  "U5",
+        "EXP-IO1_N"  : "V16",
+        "EXP-IO2_N"  : "V15",
+        "EXP-IO3_N"  : "V13",
+        "EXP-IO4_N"  : "N11",
+        "EXP-IO5_N"  : "T11",
+        "EXP-IO6_N"  : "V12",
+        "EXP-IO7_N"  : "P11",
+        "EXP-IO8_N"  :  "N9",
+        "EXP-IO9_N"  : "V11",
+        "EXP-IO10_N" : "T10",
+        "EXP-IO11_N" : "V10",
+        "EXP-IO12_N" :  "T8",
+        "EXP-IO13_N" :  "N8",
+        "EXP-IO14_N" :  "V8",
+        "EXP-IO15_N" :  "V7",
+        "EXP-IO16_N" :  "P8",
+        "EXP-IO17_N" :  "V6",
+        "EXP-IO18_N" :  "T7",
+        "EXP-IO19_N" :  "P7",
+        "EXP-IO20_N" :  "V5",
         }
     ),
 ]
 
-
-_hdmi_infos = {
-    "HDMI_IN0_MNEMONIC": "J1",
-    "HDMI_IN0_DESCRIPTION" : (
-      "  Type A connector, marked as J1, on side with USB connectors.\\r\\n"
-      "  To use J1, make sure:\\r\\n"
-      "   * JP4 has a jumper (it connects / disconnects 5V to HDMI pin 18).\\r\\n"
-      "   * JP2 (marked only as SDA/SCL - not to be confused with JP6 and JP6)\\r\\n"
-      "     has *two* jumpers (horizontally).\\r\\n"
-      "   * JP5 has a jumper (it enables the HDMI input buffer).\\r\\n"
-    ),
-
-    "HDMI_IN1_MNEMONIC": "J3",
-    "HDMI_IN1_DESCRIPTION" : (
-      "  Type A connector, marked as J3, between audio connectors and\\r\\n"
-      "  Ethernet RJ45 connector.\\r\\n"
-      "  To use J3, make sure:\\r\\n"
-      "  * JP8 has a jumper (it connects / disconnects 5V to HDMI pin 18)\\r\\n"
-      "  * JP6 and JP7 do *not* have any jumpers (it connect J3's and J2's\\r\\n"
-      "    EDID lines together).\\r\\n"
-    ),
-
-    "HDMI_OUT0_MNEMONIC": "J2",
-    "HDMI_OUT0_DESCRIPTION" : (
-      "  Type A connector, marked as J2, next to the power connector.\\r\\n"
-      "  To use J2, make sure:\\r\\n"
-      "  * JP8 has a jumper (it connects / disconnects 5V to HDMI pin 18)\\r\\n"
-      "  * JP6 and JP7 do *not* have any jumpers (it connect J3's and J2's\\r\\n"
-      "    EDID lines together).\\r\\n"
-    ),
-
-    "HDMI_OUT1_MNEMONIC": "JB",
-    "HDMI_OUT1_DESCRIPTION" : (
-      "  Micro-D connector, marked as JB, on the same side as switches\\r\\n"
-      "  + LEDs but on the underside of the board below MOD connector.\\r\\n"
-      "  Works as either output or input because it isn't buffered.\\r\\n"
-      "  Also often referred to as 'JA'.\\r\\n"
-    )
-}
-
+# Platform -----------------------------------------------------------------------------------------
 
 class Platform(XilinxPlatform):
-    name = "atlys"
-    default_clk_name = "clk100"
-    default_clk_period = 10.0
-    hdmi_infos = _hdmi_infos
+    default_clk_name   = "clk100"
+    default_clk_period = 1e9/100e6
 
-    # https://reference.digilentinc.com/atlys:atlys:refmanual#flash_memory
-    # The Atlys has a XC6SLX45 which bitstream takes up ~12Mbit (1484472 bytes)
-    # 0x200000 offset (16Mbit) gives plenty of space
-    gateware_size = 0x200000
-
-    # Micron N25Q128 (ID 0x0018ba20)
-    # FIXME: Create a "spi flash module" object in the same way we have SDRAM
-    # module objects.
-    spiflash_model = "n25q128"
-    spiflash_read_dummy_bits = 10
-    spiflash_clock_div = 4
-    spiflash_total_size = int((128/8)*1024*1024) # 128Mbit
-    spiflash_page_size = 256
-    spiflash_sector_size = 0x10000
-
-    def __init__(self, programmer="openocd", vccb2_voltage="VCC3V3"):
-        # Some IO configurations only work at certain vccb2 voltages.
-        if vccb2_voltage == "VCC3V3":
-            _io.extend(_io_vccb2_3v3)
-        elif vccb2_voltage == "VCC2V5":
-            _io.extend(_io_vccb2_2v5)
-        else:
-            raise SystemError("Unknown vccb2_voltage=%r" % vccb2_voltage)
-
-        # Resolve the LVCMOS_BANK2 voltage level before anything uses the _io
-        # definition.
-        LVCMOS_BANK2.set(vccb2_voltage)
-
-        # XC6SLX45-2CSG324C
+    def __init__(self,):
         XilinxPlatform.__init__(self,  "xc6slx45-csg324-3", _io, _connectors)
-        self.programmer = programmer
-
-        # FPGA AUX is connected to the 3.3V supply on the Atlys
         self.add_platform_command("""CONFIG VCCAUX="3.3";""")
 
     def create_programmer(self):
-	# Preferred programmer - Needs ixo-usb-jtag and latest openocd.
-        proxy="bscan_spi_{}.bit".format(self.device.split('-')[0])
-        if self.programmer == "openocd":
-            return OpenOCD(config="board/digilent_atlys.cfg", flash_proxy_basename=proxy)
-	# Alternative programmers - not regularly tested.
-        elif self.programmer == "xc3sprog":
-            return XC3SProg("jtaghs1_fast", "bscan_spi_digilent_atlys.bit")
-        elif self.programmer == "impact":
-            return iMPACT()
-        elif self.programmer == "adept":
-            return Adept("Atlys", 0)
-        elif self.programmer == "fpgalink":
-            from mibuild.fpgalink_programmer import FPGALink
-            return FPGALink("1443:0007")
-        elif self.programmer == "urjtag":
-            return UrJTAG(cable="USBBlaster", pld="spartan-6")
-        else:
-            raise ValueError("{} programmer is not supported".format(self.programmer))
+        return iMPACT()
 
     def do_finalize(self, fragment):
         XilinxPlatform.do_finalize(self, fragment)
-
-        # The oscillator clock sources.
-        try:
-            self.add_period_constraint(self.lookup_request("clk100"), 10.0)
-        except ConstraintError:
-            pass
-
-        # HDMI input clock pins.
-        for i in range(2):
-            try:
-                self.add_period_constraint(self.lookup_request("hdmi_in", i).clk_p, 12)
-            except ConstraintError:
-                pass
-
-        # Ethernet input clock pins.
-        try:
-            self.add_period_constraint(self.lookup_request("eth_clocks").rx, 40.0)
-        except ConstraintError:
-            pass
-
-        # USB input clock pins.
-        try:
-            self.add_period_constraint(self.lookup_request("fx2").ifclk, 10)
-        except ConstraintError:
-            pass
-
-
+        self.add_period_constraint(self.lookup_request("clk100",           loose=True),  1e9/100e6)
+        self.add_period_constraint(self.lookup_request("hdmi_in:clk_p", 0, loose=True),  1e9/74.25e6)
+        self.add_period_constraint(self.lookup_request("hdmi_in:clk_p", 1, loose=True),  1e9/74.25e6)
+        self.add_period_constraint(self.lookup_request("eth_clocks:rx",    loose=True),  1e9/25e6)
+        self.add_period_constraint(self.lookup_request("fx2:ifclk",        loose=True),  1e9/100e6)
diff --git a/litex_boards/targets/digilent_atlys.py b/litex_boards/targets/digilent_atlys.py
old mode 100644
new mode 100755
index f346e55..f14e8dc
--- a/litex_boards/targets/digilent_atlys.py
+++ b/litex_boards/targets/digilent_atlys.py
@@ -21,20 +21,12 @@ from migen.genlib.resetsync import AsyncResetSynchronizer
 from litex_boards.platforms import atlys
 
 from litex.soc.integration.soc_core import *
-from litex.soc.integration.soc_sdram import *
 from litex.soc.integration.builder import *
 from litex.soc.cores.led import LedChaser
 
 from litedram.modules import MT47H64M16
 from litedram.phy import s6ddrphy
 
-from liteeth.phy import LiteEthPHYGMII
-
-# LiteEthPHY
-#from liteeth.phy.mii import LiteEthMAC
-
-from liteeth.phy.mii import LiteEthPHYMII
-
 # CRG ----------------------------------------------------------------------------------------------
 
 class _CRG(Module):
@@ -58,8 +50,8 @@ class _CRG(Module):
             i_I=clk100, o_DIVCLK=clk100b)
 
         # PLL --------------------------------------------------------------------------------------
-        pll_lckd           = Signal()
-        pll_fb             = Signal()
+        pll_lckd         = Signal()
+        pll_fb           = Signal()
         pll_sdram_full   = Signal()
         pll_sdram_half_a = Signal()
         pll_sdram_half_b = Signal()
@@ -120,10 +112,6 @@ class _CRG(Module):
         # System clock
         self.specials += Instance("BUFG", i_I=pll_sys, o_O=self.cd_sys.clk)
         self.comb += self.cd_por.clk.eq(self.cd_sys.clk)
-
-        print("-- self.cd_sys.clk:")
-        print( self.cd_sys.clk)
-
         self.specials += AsyncResetSynchronizer(self.cd_sys, ~pll_lckd | (por > 0))
 
         # SDRAM clocks -----------------------------------------------------------------------------
@@ -151,32 +139,18 @@ class _CRG(Module):
         output_clk = Signal()
         clk = platform.request("ddram_clock")
         self.specials += Instance("ODDR2", p_DDR_ALIGNMENT="NONE",
-                                  p_INIT=0, p_SRTYPE="SYNC",
-                                  i_D0=1, i_D1=0, i_S=0, i_R=0, i_CE=1,
-                                  i_C0=clk_sdram_half_shifted,
-                                  i_C1=~clk_sdram_half_shifted,
-                                  o_Q=output_clk)
+            p_INIT=0, p_SRTYPE="SYNC",
+            i_D0=1, i_D1=0, i_S=0, i_R=0, i_CE=1,
+            i_C0=clk_sdram_half_shifted,
+            i_C1=~clk_sdram_half_shifted,
+            o_Q=output_clk)
         self.specials += Instance("OBUFDS", i_I=output_clk, o_O=clk.p, o_OB=clk.n)
-        #
-        #
-        # self.specials += Instance("ODDR2", p_DDR_ALIGNMENT="NONE",
-        #     p_INIT=0, p_SRTYPE="SYNC",
-        #     i_D0=1, i_D1=0, i_S=0, i_R=0, i_CE=1,
-        #     i_C0=clk_sdram_half_shifted,
-        #     i_C1=~clk_sdram_half_shifted,
-        #     o_Q=clk.p)
-        # self.specials += Instance("ODDR2", p_DDR_ALIGNMENT="NONE",
-        #     p_INIT=0, p_SRTYPE="SYNC",
-        #     i_D0=0, i_D1=1, i_S=0, i_R=0, i_CE=1,
-        #     i_C0=clk_sdram_half_shifted,
-        #     i_C1=~clk_sdram_half_shifted,
-        #     o_Q=clk.n)
 
 # BaseSoC ------------------------------------------------------------------------------------------
 
 class BaseSoC(SoCCore):
     def __init__(self, with_ethernet=True, with_etherbone=False, eth_phy=0, **kwargs):
-        sys_clk_freq = int(75e6) # Fraction(75*1000*1000,1) # (83 + Fraction(1, 3))*1000*1000
+        sys_clk_freq = int(75e6)
         platform     = atlys.Platform()
 
         # SoCCore ----------------------------------------------------------------------------------
@@ -189,7 +163,7 @@ class BaseSoC(SoCCore):
         self.submodules.crg = _CRG(platform, sys_clk_freq)
         self.platform.add_period_constraint(self.crg.cd_sys.clk, 1e9/sys_clk_freq)
 
-        # DDR2 SDRAM ------------------------------------------------------------------------------
+        # DDR2 SDRAM -------------------------------------------------------------------------------
         if not self.integrated_main_ram_size:
             self.submodules.ddrphy = s6ddrphy.S6HalfRateDDRPHY(platform.request("ddram"),
                 memtype           = "DDR2",
@@ -200,15 +174,10 @@ class BaseSoC(SoCCore):
                 self.ddrphy.clk4x_wr_strb.eq(self.crg.clk4x_wr_strb),
                 self.ddrphy.clk4x_rd_strb.eq(self.crg.clk4x_rd_strb),
             ]
-            self.add_csr("ddrphy")
             self.add_sdram("sdram",
-                phy                     = self.ddrphy,
-                module                  = MT47H64M16(sys_clk_freq, "1:2"),
-                origin                  = self.mem_map["main_ram"],
-                size                    = kwargs.get("max_sdram_size", 0x4000000), # 0x100000000),
-                l2_cache_size           = kwargs.get("l2_size", 8192),
-                l2_cache_min_data_width = kwargs.get("min_l2_data_width", 128),
-                l2_cache_reverse        = True
+                phy           = self.ddrphy,
+                module        = MT47H64M16(sys_clk_freq, "1:2"),
+                l2_cache_size = kwargs.get("l2_size", 8192),
             )
 
         # Ethernet / Etherbone ---------------------------------------------------------------------
@@ -218,35 +187,20 @@ class BaseSoC(SoCCore):
                 clock_pads = self.platform.request("eth_clocks", eth_phy),
                 pads       = self.platform.request("eth", eth_phy),
                 clk_freq   = int(self.sys_clk_freq))
-            self.add_csr("ethphy")
-
             if with_ethernet:
                 self.add_ethernet(phy=self.ethphy)
             if with_etherbone:
-                print("etherbone")
                 self.add_etherbone(phy=self.ethphy)
-
             self.ethphy.crg.cd_eth_rx.clk.attr.add("keep")
             self.ethphy.crg.cd_eth_tx.clk.attr.add("keep")
-
-            # FIXME: This is probably too tight?
-#            self.platform.add_period_constraint(self.ethphy.crg.cd_eth_rx.clk, 8.0)
-
-
             self.platform.add_platform_command("""
-# FIXME: ERROR:Place:1108 - A clock IOB / BUFGMUX clock component pair have
-# been found that are not placed at an optimal clock IOB / BUFGMUX site pair.
-# The clock IOB component <eth_clocks_rx> is placed at site <K15>.
 NET "{eth_clocks_rx}" CLOCK_DEDICATED_ROUTE = FALSE;
-# The IOB component <eth_clocks_tx> is placed at site <K16>.
 NET "{eth_clocks_tx}" CLOCK_DEDICATED_ROUTE = FALSE;
 """,
             eth_clocks_rx=platform.lookup_request("eth_clocks").rx,
             eth_clocks_tx=platform.lookup_request("eth_clocks").tx,
             )
 
-
-            # self.add_interrupt("ethmac")
         # Leds -------------------------------------------------------------------------------------
         self.submodules.leds = LedChaser(
             pads         = platform.request_all("user_led"),
@@ -263,10 +217,10 @@ def main():
     parser.add_argument("--with-etherbone", action="store_true", help="Enable Etherbone support")
 
     builder_args(parser)
-    soc_sdram_args(parser)
+    soc_core_args(parser)
     args = parser.parse_args()
 
-    soc = BaseSoC(**soc_sdram_argdict(args))
+    soc = BaseSoC(**soc_core_argdict(args))
     builder = Builder(soc, **builder_argdict(args), )
     builder.build(run=args.build)