aboutsummaryrefslogtreecommitdiff
path: root/amaranth_boards/stepmxo2.py
blob: 41b715743b33ef0800195e17a8aa43a27ebdd19d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import os
import argparse
import subprocess


from amaranth.build import *
from amaranth.vendor import LatticeMachXO2Platform
from .resources import *


__all__ = ["StepMXO2Platform"]


class StepMXO2Platform(LatticeMachXO2Platform):
    package     = "MG132"
    speed       = "4"
    default_clk = "clk12"
    device      = "LCMXO2-4000HC"
    resources   = [
        Resource("clk12", 0, Pins("C1", dir="i"), Attrs(IO_TYPE="LVCMOS33"),
                 Clock(12e6)),

        UARTResource(0, rx="A3", tx="A2", attrs=Attrs(IO_TYPE="LVCMOS33"),
                     role="dce"),

        *LEDResources(pins="N13 M12 P12 M11 P11 N10 N9 P9",
                      invert=True, attrs=Attrs(IO_TYPE="LVCMOS33")),

        RGBLEDResource(0, r="M2", g="N2", b="P2",
                       invert=True, attrs=Attrs(IO_TYPE="LVCMOS33")),
        RGBLEDResource(1, r="M3", g="N3", b="P4",
                       invert=True, attrs=Attrs(IO_TYPE="LVCMOS33")),

        *ButtonResources(pins="L14 M13 M14 N14", invert=True,
                         attrs=Attrs(IO_TYPE="LVCMOS33")),

        *SwitchResources(pins="M7 M8 M9 M10",
                         attrs=Attrs(IO_TYPE="LVCMOS33")),

        Display7SegResource(0,
            a="A10", b="C11", c="F2", d="E1", e="E2", f="A9", g="B9", dp="F1",
            attrs=Attrs(IO_TYPE="LVCMOS33")
        ),
        Display7SegResource(1,
            a="C12", b="B14", c="J1", d="H1", e="H2", f="B12", g="A11",
            dp="K1", attrs=Attrs(IO_TYPE="LVCMOS33")
        ),
        Resource("display_7seg_ctrl", 0,
            Subsignal("en", Pins("C9 A12", invert=True, dir="o")),
            Attrs(IO_TYPE="LVCMOS33")
        )
    ]
    connectors  = [
        # Special pins for MachXO2 hard IP.
        # I2C: 2- SCL, 3- SDA
        # SPI: 25- CS_N, 24- CLK, 22- COPI, 23- CIPO
        Connector("gpio", 0,
                  # Left side of the board
                  # 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
                  " - C8 B8 E3 F3 G3 H3 I2 I3 K2 K3 L3 N5 P6 N6 P7 N7 P8 N8  -"
                  # Right side of the board
                  # 21  22 23 24 25  26  27  28  29  30  31  32  33  34  35  36  37  38  39 40
                  "  - P13 N4 M4 P3 J12 K13 K14 K12 J14 J13 H12 G14 G13 F14 F13 G12 F12 E12  -"
        ),
    ]

    # This board doesn't have an integrated programmer; the board's MCU
    # implements a mass-storage device. You copy the JED file to it.

    # Workaround a STEP-MXO2-LPC parsing bug in the bootloader, as it doesn't
    # like JED files processed by ddtcmd. Copy the original JED file unchanged
    # to {{name}}-lpc.jed. Prefer this file.
    @property
    def command_templates(self):
        templates = super().command_templates
        cp_template = r"""{%- if syntax == "sh" -%}
                                cp {{name}}_impl/{{name}}_impl.jed {{name}}-lpc.jed
                          {%- else -%}
                                copy {{name}}_impl\{{name}}_impl.jed {{name}}-lpc.jed
                          {%- endif -%}
                       """

        if self.family == "machxo2":
            if self.toolchain == "Diamond":
                return templates + [cp_template]
            if self.toolchain == "Trellis":
                return self.templates
            assert False
        assert False


if __name__ == "__main__":
    from .test.blinky import *

    parser = argparse.ArgumentParser()
    parser.add_argument('toolchain', nargs="?", choices=["Trellis", "Diamond"], default="Diamond")
    args = parser.parse_args()

    StepMXO2Platform(toolchain=args.toolchain).build(Blinky(), do_program=False)