From ced3363ee5442f8ca93ecdb3377212bf724d6af7 Mon Sep 17 00:00:00 2001 From: Staf Verhaegen Date: Sat, 8 Aug 2020 11:42:38 +0200 Subject: [PATCH] Support Arty S7-50 Added Xilinx xc7s50 device to part.hpp; added support for generating spiOverJtag bitstream file for that device and added bitstream to repo. Converted xdc file from DOC line endings to native line endings. --- CMakeLists.txt | 1 + README.md | 5 +++-- spiOverJtag/.gitignore | 2 +- spiOverJtag/Makefile | 19 +++++++++--------- spiOverJtag/{constr.xdc => constr_xc7a35.xdc} | 18 ++++++++--------- spiOverJtag/constr_xc7s50.xdc | 9 +++++++++ spiOverJtag/spiOverJtag_xc7s50.bit | Bin 0 -> 2192126 bytes spiOverJtag/xilinx_spiOverJtag.tcl | 9 +++++---- src/part.hpp | 1 + 9 files changed, 38 insertions(+), 26 deletions(-) rename spiOverJtag/{constr.xdc => constr_xc7a35.xdc} (98%) create mode 100644 spiOverJtag/constr_xc7s50.xdc create mode 100644 spiOverJtag/spiOverJtag_xc7s50.bit diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f8a6c1..2948dfa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -159,5 +159,6 @@ install(TARGETS openFPGALoader DESTINATION bin) install(FILES test_sfl.svf spiOverJtag/spiOverJtag_xc7a35.bit + spiOverJtag/spiOverJtag_xc7s50.bit DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/openFPGALoader ) diff --git a/README.md b/README.md index 553349e..415a1d4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ __Current support kits:__ * Trenz cyc1000 Cyclone 10 LP 10CL025 (memory and spi flash) * [Colorlight 5A-75B (version 7)](https://fr.aliexpress.com/item/32281130824.html) (memory and spi flash) -* Digilent arty Artix xc7a35ti (memory and spi flash) +* [Digilent Arty A7 xc7a35ti](https://reference.digilentinc.com/reference/programmable-logic/arty-a7/start) (memory and spi flash) +* [Digilent Arty S7 xc7s50](https://reference.digilentinc.com/reference/programmable-logic/arty-s7/start) (memory and spi flash) * [Lattice MachXO2 Breakout Board Evaluation Kit (LCMXO2-7000HE)](https://www.latticesemi.com/products/developmentboardsandkits/machxo2breakoutboard) (memory and flash) * Lattice MachXO3LF Starter Kit LCMX03LF-6900C (memory and flash) * [Lattice ECP5 5G Evaluation Board (LFE5UM5G-85F-EVN)](https://www.latticesemi.com/en/Products/DevelopmentBoardsAndKits/ECP5EvaluationBoard) (memory and spi flash) @@ -23,7 +24,7 @@ __Supported (tested) FPGA:__ * Lattice [ECP5 (25F, 5G 85F](http://www.latticesemi.com/Products/FPGAandCPLD/ECP5) (SRAM and Flash) * Xilinx Artix 7 [xc7a35ti, xc7a100t](https://www.xilinx.com/products/silicon-devices/fpga/artix-7.html) (memory (all) and spi flash (xc7a35ti) * Xilinx Spartan 6 [xc6slx45](https://www.xilinx.com/products/silicon-devices/fpga/spartan-6.html) (memory) -* Xilinx Spartan 7 [xc7s15](https://www.xilinx.com/products/silicon-devices/fpga/spartan-7.html) (memory) +* Xilinx Spartan 7 [xc7s15, xc7s50](https://www.xilinx.com/products/silicon-devices/fpga/spartan-7.html) (memory (all) and spi flash (xc7s50)) * Intel Cyclone 10 LP [10CL025](https://www.intel.com/content/www/us/en/products/programmable/fpga/cyclone-10.html) __Supported cables:__ diff --git a/spiOverJtag/.gitignore b/spiOverJtag/.gitignore index a9a5aec..ab1a990 100644 --- a/spiOverJtag/.gitignore +++ b/spiOverJtag/.gitignore @@ -1 +1 @@ -tmp +tmp_* diff --git a/spiOverJtag/Makefile b/spiOverJtag/Makefile index 8be7aa5..834b4b1 100644 --- a/spiOverJtag/Makefile +++ b/spiOverJtag/Makefile @@ -1,14 +1,13 @@ VIVADO := vivado -nolog -nojournal -mode batch -source -MODEL = xc7a35 -PRJ = spiOverJtag_$(MODEL) +MODELS := xc7a35 xc7s50 +BIT_FILES := $(addsuffix .bit,$(addprefix spiOverJtag_, $(MODELS))) -BIT_PATH = tmp/$(PRJ).runs/impl_1/ -BIT_TMP_FILE = $(BIT_PATH)/*.bit -BIT_FILE = $(PRJ).bit +all: $(BIT_FILES) + +$(BIT_FILES) : spiOverJtag_%.bit : tmp_%/spiOverJtag.runs/impl_1/xilinx_spiOverJtag.bit + cp $< $@ +tmp_%/spiOverJtag.runs/impl_1/xilinx_spiOverJtag.bit : xilinx_spiOverJtag.vhd constr_%.xdc + $(VIVADO) xilinx_spiOverJtag.tcl -tclargs $* -$(BIT_FILE) : $(BIT_TMP_FILE) - cp $(BIT_TMP_FILE) $(BIT_FILE) -$(BIT_TMP_FILE): xilinx_spiOverJtag.vhd constr.xdc - $(VIVADO) xilinx_spiOverJtag.tcl -tclargs $(MODEL) clean: - -rm -rf tmp *.jou *.log .Xil + -rm -rf tmp_* *.jou *.log .Xil diff --git a/spiOverJtag/constr.xdc b/spiOverJtag/constr_xc7a35.xdc similarity index 98% rename from spiOverJtag/constr.xdc rename to spiOverJtag/constr_xc7a35.xdc index 72cd66b..fd0df62 100644 --- a/spiOverJtag/constr.xdc +++ b/spiOverJtag/constr_xc7a35.xdc @@ -1,9 +1,9 @@ -set_property CFGBVS VCCO [current_design] -set_property CONFIG_VOLTAGE 3.3 [current_design] -set_property BITSTREAM.CONFIG.SPI_BUSWIDTH {4} [current_design] - -set_property -dict {PACKAGE_PIN L13 IOSTANDARD LVCMOS33} [get_ports {csn}]; -set_property -dict {PACKAGE_PIN K17 IOSTANDARD LVCMOS33} [get_ports {sdi_dq0}]; -set_property -dict {PACKAGE_PIN K18 IOSTANDARD LVCMOS33} [get_ports {sdo_dq1}]; -set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} [get_ports {wpn_dq2}]; -set_property -dict {PACKAGE_PIN M14 IOSTANDARD LVCMOS33} [get_ports {hldn_dq3}]; +set_property CFGBVS VCCO [current_design] +set_property CONFIG_VOLTAGE 3.3 [current_design] +set_property BITSTREAM.CONFIG.SPI_BUSWIDTH {4} [current_design] + +set_property -dict {PACKAGE_PIN L13 IOSTANDARD LVCMOS33} [get_ports {csn}]; +set_property -dict {PACKAGE_PIN K17 IOSTANDARD LVCMOS33} [get_ports {sdi_dq0}]; +set_property -dict {PACKAGE_PIN K18 IOSTANDARD LVCMOS33} [get_ports {sdo_dq1}]; +set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} [get_ports {wpn_dq2}]; +set_property -dict {PACKAGE_PIN M14 IOSTANDARD LVCMOS33} [get_ports {hldn_dq3}]; diff --git a/spiOverJtag/constr_xc7s50.xdc b/spiOverJtag/constr_xc7s50.xdc new file mode 100644 index 0000000..28938dd --- /dev/null +++ b/spiOverJtag/constr_xc7s50.xdc @@ -0,0 +1,9 @@ +set_property CFGBVS VCCO [current_design] +set_property CONFIG_VOLTAGE 3.3 [current_design] +set_property BITSTREAM.CONFIG.SPI_BUSWIDTH {4} [current_design] + +set_property -dict {PACKAGE_PIN M13 IOSTANDARD LVCMOS33} [get_ports {csn}]; +set_property -dict {PACKAGE_PIN K17 IOSTANDARD LVCMOS33} [get_ports {sdi_dq0}]; +set_property -dict {PACKAGE_PIN K18 IOSTANDARD LVCMOS33} [get_ports {sdo_dq1}]; +set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} [get_ports {wpn_dq2}]; +set_property -dict {PACKAGE_PIN M15 IOSTANDARD LVCMOS33} [get_ports {hldn_dq3}]; diff --git a/spiOverJtag/spiOverJtag_xc7s50.bit b/spiOverJtag/spiOverJtag_xc7s50.bit new file mode 100644 index 0000000000000000000000000000000000000000..f3ea57e966f63a820c0539d6671a3140b3e42218 GIT binary patch literal 2192126 zcmeI*&u?2v9RTpLlZd2gHfaNgCH?Uzg&siQrUmwgDqIMwEx8dwg zSv6~JhgvnXZd-L>r>?dAq2~6^e)V=Mrjk{v;fwFpDo@(`jmq4sAN;zVcd6C3SvOy) zg~$2rLVnwhoeMi{c60W+t%ao;A5SR&p)t9Dl8uck0vmp~8Fj9fl`bg8INmfbIja~@s2|V4~nx2h%d#H=k zGvqQOz4)6l(GwM$P1I-%h5&)20xKU**4u=>q$W*=w{3~4tpjUo-V0WB5 z^&=)PwlD4{Pgi1YZMR!-v8-(U{D=f4(+wE`W@3$73Ri*OfnWp4&?)iiRtv(Ky zqPxo;hmbwY!!L#A!RuJLq>WTmX0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlqQeds~f6f>(L;7YZzt)j{c6ua0fB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0tCtmT)bJf#RSAx zCtwVQK!Cup3ar+Twfo^ZpThIu4mVM)2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&g7C4{s_ceZpcz6MnOohNo%2B3#Os1Td zz6cN?K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXFBouh&O9?xR?P@+Ya5m#sU!J~s`B~)jt=Y7X_~NbUn}MH2PT!hM`-m@mc>-s! zIDum_Bmx8o5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0tAjEuyP#dKRMy&H#yRRX-t3s0RjXf1 zEwGYub}64HQ_f3Y1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlq zgTTTsBa${EViJZpeM&-XUF`^b>P51sDFEFb>vb>B=DpYGeSIS~S<-s>}rEU(+W_6bupq(CEY*Sr=k zbGHixW7ut!%vmpFiBH^8Vp6 zB?$$(yvbbuL$CfDy(*NCQlQJ4EWXpLgGTp?tb4K2(FrV{?UQS*9zt^+3v221q>ovN zs$R!<7ynZtiO|stba{9Drua_*_ zIWF8UMBT^**6+7ccKw^9KJxA)>>`jA%6dI_bzP%ETe}2iRUj)&?AadQTWLK`GOs5E zuW{@a*Cc$Z)l2cYYG=PbjuFT?NMP-ggCYjjH;>p9-(nAJB%qJLT%Wr5s@w6QA_)*6 zFam*v*c`WF1H~OtV6E4OU5D~s-YKcRb*MtYC z?SWfeKBpYmMgV~s5ZEaG0pD*yp!48Z|6OFlPLs$6 z!r}xDAC_7=7tykj$26}l1PBlyaMA?|FC?8ewaafr(sY_cHV_skkR1wJx^bvT0RaL9 zfwinq&~3Mo7dEdhNd%Uc;=A#Z5^r^s$mKJ!t>;6d@J=DNrMPke8y}C3-gaYhm$>HHifqI&S$wY}5HizsT~3i8YA@6Gwmm0RjY$RbaWyZ-Sz~ z?|rOO(m8=+6u5Gw+4-61WBbQA)DzQnYfY|QJ24ZUf{9+a^6tAKSd&Rws@9r#?wX`E zF%|+RMxb7t>9f(t>WeMyk4T_i%wtW8BK8RoAV7e?YzUnC`@nhB2Sx}WK!8AEfsOd@ zLHa~1(b|0U9|JpT42%#kQUQ;Xk#b5#fB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7e?L$Xs^*iYmKtX+&j&6dy=o) oLZucSw{Jt`UvK~XPrK{ZZnLtx?{;$5(^^;y_W}2TNxKjHA7xMP&j0`b literal 0 HcmV?d00001 diff --git a/spiOverJtag/xilinx_spiOverJtag.tcl b/spiOverJtag/xilinx_spiOverJtag.tcl index e404bc4..4bfe615 100644 --- a/spiOverJtag/xilinx_spiOverJtag.tcl +++ b/spiOverJtag/xilinx_spiOverJtag.tcl @@ -1,15 +1,16 @@ set model [lindex $argv 0] -set project_name "spiOverJtag_${model}" +set project_name "spiOverJtag" -set build_path tmp +set build_path tmp_${model} file delete -force $build_path # Project creation -create_project $project_name $build_path -part xc7a35ticsg324-1L +set parts [dict create xc7a35 xc7a35ticsg324-1L xc7s50 xc7s50csga324-1] +create_project $project_name $build_path -part [dict get $parts $model] add_files -norecurse xilinx_spiOverJtag.vhd -add_files -norecurse -fileset constrs_1 constr.xdc +add_files -norecurse -fileset constrs_1 constr_${model}.xdc set_property VERILOG_DEFINE {TOOL_VIVADO} [current_fileset] diff --git a/src/part.hpp b/src/part.hpp index e81095a..08a004c 100644 --- a/src/part.hpp +++ b/src/part.hpp @@ -16,6 +16,7 @@ static std::map fpga_list = { {0x44008093, {"xilinx", "spartan6", "xc6slx45"}}, {0x03620093, {"xilinx", "spartan7", "xc7s15ftgb196-1"}}, + {0x0362f093, {"xilinx", "spartan7", "xc7s50"}}, {0x020f30dd, {"altera", "cyclone 10 LP", "10CL025"}},