mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
mibuild/lattice: use new Toolchain/Platform architecture
This commit is contained in:
parent
e903b62af1
commit
d6041879dd
5 changed files with 42 additions and 13 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
from mibuild.lattice.platform import LatticePlatform
|
||||||
|
from mibuild.lattice.programmer import LatticeProgrammer
|
1
mibuild/lattice/common.py
Normal file
1
mibuild/lattice/common.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
lattice_special_overrides = {}
|
|
@ -5,7 +5,9 @@ import os, subprocess, shutil
|
||||||
|
|
||||||
from migen.fhdl.structure import _Fragment
|
from migen.fhdl.structure import _Fragment
|
||||||
from mibuild.generic_platform import *
|
from mibuild.generic_platform import *
|
||||||
|
|
||||||
from mibuild import tools
|
from mibuild import tools
|
||||||
|
from mibuild.lattice import common
|
||||||
|
|
||||||
def _format_constraint(c):
|
def _format_constraint(c):
|
||||||
if isinstance(c, Pins):
|
if isinstance(c, Pins):
|
||||||
|
@ -61,23 +63,22 @@ def _run_diamond(build_name, source, ver=None):
|
||||||
if r != 0:
|
if r != 0:
|
||||||
raise OSError("Subprocess failed")
|
raise OSError("Subprocess failed")
|
||||||
|
|
||||||
class LatticeDiamondPlatform(GenericPlatform):
|
class LatticeDiamondToolchain:
|
||||||
bitstream_ext = ".bit"
|
def build(self, platform, fragment, build_dir="build", build_name="top",
|
||||||
def build(self, fragment, build_dir="build", build_name="top",
|
|
||||||
diamond_path="/opt/Diamond", run=True):
|
diamond_path="/opt/Diamond", run=True):
|
||||||
tools.mkdir_noerror(build_dir)
|
tools.mkdir_noerror(build_dir)
|
||||||
os.chdir(build_dir)
|
os.chdir(build_dir)
|
||||||
|
|
||||||
if not isinstance(fragment, _Fragment):
|
if not isinstance(fragment, _Fragment):
|
||||||
fragment = fragment.get_fragment()
|
fragment = fragment.get_fragment()
|
||||||
self.finalize(fragment)
|
platform.finalize(fragment)
|
||||||
|
|
||||||
v_src, vns = self.get_verilog(fragment)
|
v_src, vns = platform.get_verilog(fragment)
|
||||||
named_sc, named_pc = self.resolve_signals(vns)
|
named_sc, named_pc = platform.resolve_signals(vns)
|
||||||
v_file = build_name + ".v"
|
v_file = build_name + ".v"
|
||||||
tools.write_to_file(v_file, v_src)
|
tools.write_to_file(v_file, v_src)
|
||||||
sources = self.sources + [(v_file, "verilog")]
|
sources = platform.sources + [(v_file, "verilog")]
|
||||||
_build_files(self.device, sources, self.verilog_include_paths, build_name)
|
_build_files(platform.device, sources, platform.verilog_include_paths, build_name)
|
||||||
|
|
||||||
tools.write_to_file(build_name + ".lpf", _build_lpf(named_sc, named_pc))
|
tools.write_to_file(build_name + ".lpf", _build_lpf(named_sc, named_pc))
|
||||||
|
|
||||||
|
@ -88,6 +89,6 @@ class LatticeDiamondPlatform(GenericPlatform):
|
||||||
|
|
||||||
return vns
|
return vns
|
||||||
|
|
||||||
def add_period_constraint(self, clk, period):
|
def add_period_constraint(self, platform, clk, period):
|
||||||
# TODO: handle differential clk
|
# TODO: handle differential clk
|
||||||
self.add_platform_command("""FREQUENCY PORT "{clk}" {freq} MHz;""".format(freq=str(float(1/period)*1000), clk="{clk}"), clk=clk)
|
platform.add_platform_command("""FREQUENCY PORT "{clk}" {freq} MHz;""".format(freq=str(float(1/period)*1000), clk="{clk}"), clk=clk)
|
||||||
|
|
25
mibuild/lattice/platform.py
Normal file
25
mibuild/lattice/platform.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
from mibuild.generic_platform import GenericPlatform
|
||||||
|
from mibuild.lattice import common, diamond
|
||||||
|
|
||||||
|
class LatticePlatform(GenericPlatform):
|
||||||
|
bitstream_ext = ".bit"
|
||||||
|
|
||||||
|
def __init__(self, *args, toolchain="diamond", **kwargs):
|
||||||
|
GenericPlatform.__init__(self, *args, **kwargs)
|
||||||
|
if toolchain == "diamond":
|
||||||
|
self.toolchain = diamond.LatticeDiamondToolchain()
|
||||||
|
else:
|
||||||
|
raise ValueError("Unknown toolchain")
|
||||||
|
|
||||||
|
def get_verilog(self, *args, special_overrides=dict(), **kwargs):
|
||||||
|
so = dict(common.lattice_special_overrides)
|
||||||
|
so.update(special_overrides)
|
||||||
|
return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs)
|
||||||
|
|
||||||
|
def build(self, *args, **kwargs):
|
||||||
|
return self.toolchain.build(self, *args, **kwargs)
|
||||||
|
|
||||||
|
def add_period_constraint(self, clk, period):
|
||||||
|
if hasattr(clk, "p"):
|
||||||
|
clk = clk.p
|
||||||
|
self.toolchain.add_period_constraint(self, clk, period)
|
|
@ -2,7 +2,7 @@
|
||||||
# License: BSD
|
# License: BSD
|
||||||
|
|
||||||
from mibuild.generic_platform import *
|
from mibuild.generic_platform import *
|
||||||
from mibuild.lattice.diamond import LatticeDiamondPlatform
|
from mibuild.lattice import LatticePlatform
|
||||||
from mibuild.lattice.programmer import LatticeProgrammer
|
from mibuild.lattice.programmer import LatticeProgrammer
|
||||||
|
|
||||||
_io = [
|
_io = [
|
||||||
|
@ -23,12 +23,12 @@ _io = [
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
class Platform(LatticeDiamondPlatform):
|
class Platform(LatticePlatform):
|
||||||
default_clk_name = "clk100"
|
default_clk_name = "clk100"
|
||||||
default_clk_period = 10
|
default_clk_period = 10
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
LatticeDiamondPlatform.__init__(self, "LFE3-35EA-6FN484C", _io)
|
LatticePlatform.__init__(self, "LFE3-35EA-6FN484C", _io)
|
||||||
|
|
||||||
def create_programmer(self):
|
def create_programmer(self):
|
||||||
return LatticeProgrammer()
|
return LatticeProgrammer()
|
||||||
|
|
Loading…
Reference in a new issue