8291465a50c7e25f85cd81326e8d2887c801d73b
5 from migen
.build
.generic_programmer
import GenericProgrammer
6 from migen
.build
.xilinx
import common
10 with subprocess
.Popen("jtag", stdin
=subprocess
.PIPE
) as process
:
11 process
.stdin
.write(cmds
.encode("ASCII"))
15 class UrJTAG(GenericProgrammer
):
16 needs_bitreverse
= True
18 def __init__(self
, cable
, flash_proxy_basename
=None):
19 GenericProgrammer
.__init
__(self
, flash_proxy_basename
)
22 def load_bitstream(self
, bitstream_file
):
23 cmds
= """cable {cable}
27 """.format(bitstream
=bitstream_file
, cable
=self
.cable
)
30 def flash(self
, address
, data_file
):
31 flash_proxy
= self
.find_flash_proxy()
32 cmds
= """cable {cable}
34 pld load "{flash_proxy}"
35 initbus fjmem opcode=000010
39 flashmem "{address}" "{data_file}" noverify
40 """.format(flash_proxy
=flash_proxy
, address
=address
, data_file
=data_file
,
45 class XC3SProg(GenericProgrammer
):
46 needs_bitreverse
= False
48 def __init__(self
, cable
, flash_proxy_basename
=None):
49 GenericProgrammer
.__init
__(self
, flash_proxy_basename
)
52 def load_bitstream(self
, bitstream_file
):
53 subprocess
.call(["xc3sprog", "-v", "-c", self
.cable
, bitstream_file
])
55 def flash(self
, address
, data_file
):
56 flash_proxy
= self
.find_flash_proxy()
57 subprocess
.call(["xc3sprog", "-v", "-c", self
.cable
, "-I"+flash_proxy
, "{}:w:0x{:x}:BIN".format(data_file
, address
)])
61 class FpgaProg(GenericProgrammer
):
62 needs_bitreverse
= False
64 def __init__(self
, flash_proxy_basename
=None):
65 GenericProgrammer
.__init
__(self
, flash_proxy_basename
)
67 def load_bitstream(self
, bitstream_file
):
68 subprocess
.call(["fpgaprog", "-v", "-f", bitstream_file
])
70 def flash(self
, address
, data_file
):
72 raise ValueError("fpga prog needs a main bitstream at address 0")
73 flash_proxy
= self
.find_flash_proxy()
74 subprocess
.call(["fpgaprog", "-v", "-sa", "-r", "-b", flash_proxy
,
78 def _run_impact(cmds
):
79 with subprocess
.Popen("impact -batch", stdin
=subprocess
.PIPE
, shell
=True) as process
:
80 process
.stdin
.write(cmds
.encode("ASCII"))
82 return process
.returncode
85 def _create_xsvf(bitstream_file
, xsvf_file
):
86 assert os
.path
.exists(bitstream_file
), bitstream_file
87 assert not os
.path
.exists(xsvf_file
), xsvf_file
88 assert 0 == _run_impact("""
89 setPreference -pref KeepSVF:True
91 setCable -port xsvf -file {xsvf}
92 addDevice -p 1 -file {bitstream}
95 """.format(bitstream
=bitstream_file
, xsvf
=xsvf_file
))
98 class iMPACT(GenericProgrammer
):
99 needs_bitreverse
= False
101 def load_bitstream(self
, bitstream_file
):
102 cmds
= """setMode -bs
104 addDevice -p 1 -file {bitstream}
107 """.format(bitstream
=bitstream_file
)
111 def _run_vivado(path
, ver
, cmds
):
112 if sys
.platform
== "win32" or sys
.platform
== "cygwin":
113 vivado_cmd
= "vivado -mode tcl"
115 settings
= common
.settings(path
, ver
)
116 vivado_cmd
= "bash -c \"source " + settings
+ "&& vivado -mode tcl\""
117 with subprocess
.Popen(vivado_cmd
, stdin
=subprocess
.PIPE
, shell
=True) as process
:
118 process
.stdin
.write(cmds
.encode("ASCII"))
119 process
.communicate()
122 class VivadoProgrammer(GenericProgrammer
):
123 needs_bitreverse
= False
124 def __init__(self
, vivado_path
="/opt/Xilinx/Vivado", vivado_ver
=None,
125 flash_part
="n25q256-3.3v-spi-x1_x2_x4"):
126 GenericProgrammer
.__init
__(self
)
127 self
.vivado_path
= vivado_path
128 self
.vivado_ver
= vivado_ver
129 self
.flash_part
= flash_part
131 def load_bitstream(self
, bitstream_file
):
134 open_hw_target [lindex [get_hw_targets -of_objects [get_hw_servers localhost]] 0]
136 set_property PROBES.FILE {{}} [lindex [get_hw_devices] 0]
137 set_property PROGRAM.FILE {{{bitstream}}} [lindex [get_hw_devices] 0]
139 program_hw_devices [lindex [get_hw_devices] 0]
140 refresh_hw_device [lindex [get_hw_devices] 0]
143 """.format(bitstream
=bitstream_file
)
144 _run_vivado(self
.vivado_path
, self
.vivado_ver
, cmds
)
146 # XXX works to flash bitstream, adapt it to flash bios
147 def flash(self
, address
, data_file
):
150 open_hw_target [lindex [get_hw_targets -of_objects [get_hw_servers localhost]] 0]
151 create_hw_cfgmem -hw_device [lindex [get_hw_devices] 0] -mem_dev [lindex [get_cfgmem_parts {{{flash_part}}}] 0]
153 set_property PROGRAM.BLANK_CHECK 0 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
154 set_property PROGRAM.ERASE 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
155 set_property PROGRAM.CFG_PROGRAM 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
156 set_property PROGRAM.VERIFY 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
157 refresh_hw_device [lindex [get_hw_devices] 0]
159 set_property PROGRAM.ADDRESS_RANGE {{use_file}} [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
160 set_property PROGRAM.FILES [list "{data}" ] [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0]]
161 set_property PROGRAM.UNUSED_PIN_TERMINATION {{pull-none}} [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
162 set_property PROGRAM.BLANK_CHECK 0 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
163 set_property PROGRAM.ERASE 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
164 set_property PROGRAM.CFG_PROGRAM 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
165 set_property PROGRAM.VERIFY 1 [ get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
168 if {{![string equal [get_property PROGRAM.HW_CFGMEM_TYPE [lindex [get_hw_devices] 0]] [get_property MEM_TYPE [get_property CFGMEM_PART [get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]]]] }} {{ create_hw_bitstream -hw_device [lindex [get_hw_devices] 0] [get_property PROGRAM.HW_CFGMEM_BITFILE [ lindex [get_hw_devices] 0]]; program_hw_devices [lindex [get_hw_devices] 0]; }};
169 program_hw_cfgmem -hw_cfgmem [get_property PROGRAM.HW_CFGMEM [lindex [get_hw_devices] 0 ]]
173 """.format(data
=data_file
, flash_part
=self
.flash_part
)
174 _run_vivado(self
.vivado_path
, self
.vivado_ver
, cmds
)
177 class Adept(GenericProgrammer
):
178 """Using the Adept tool with an onboard Digilent "USB JTAG" cable.
180 You need to install Adept Utilities V2 from
181 http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,66,828&Prod=ADEPT2
184 needs_bitreverse
= False
186 def __init__(self
, board
, index
, flash_proxy_basename
=None):
187 GenericProgrammer
.__init
__(self
, flash_proxy_basename
)
191 def load_bitstream(self
, bitstream_file
):
195 "prog", "-d", self
.board
,
196 "-i", str(self
.index
),
197 "-f", bitstream_file
,
200 def flash(self
, address
, data_file
):
201 raise ValueError("Flashing unsupported with DigilentAdept tools")