Преглед изворни кода

Initial import of the structure and build system

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Sylvain Munaut пре 6 година
комит
e2c6a58101
9 измењених фајлова са 386 додато и 0 уклоњено
  1. 6 0
      LICENSE
  2. 30 0
      LICENSE.bsd
  3. 177 0
      LICENSE.lgpl3
  4. 12 0
      README.md
  5. 15 0
      build/core-magic.mk
  6. 49 0
      build/core-rules.mk
  7. 97 0
      build/project-rules.mk
  8. 0 0
      cores/.keep
  9. 0 0
      projects/.keep

+ 6 - 0
LICENSE

@@ -0,0 +1,6 @@
+The files in this repository are either licensed under :
+
+ - the BSD 3-clause license (see LICENSE.bsd)
+ - GNU Lesser General Public License v3 (LICENSE.lgpl3)
+
+Each file has the applicable license in its header.

+ 30 - 0
LICENSE.bsd

@@ -0,0 +1,30 @@
+BSD 3-Clause License
+
+Copyright (c) 2019, Sylvain Munaut <tnt@246tNt.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+Copyright 2019  Sylvain Munaut <tnt@246tNt.com>

+ 177 - 0
LICENSE.lgpl3

@@ -0,0 +1,177 @@
+                   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
+-----
+
+Note: As far as the above text is open to interpretation when applied to
+HDL ip cores, it should be understood in the following manner :
+
+ - usage of the ip core itself, as is in this repository only requires
+   to provide a mean to rebuild the distributed images/bitstreams using
+   a different version of the ip core with the same interface
+
+ - usage of a modified version of the ip core additionally requires to
+   provide the modifies sources.

+ 12 - 0
README.md

@@ -0,0 +1,12 @@
+# iCE40 Playground
+# ================
+
+Collection of ip cores / modules and example projects for the
+Lattice iCE40 FPGA family.
+
+Examples are often targeted for the ICEBreaker FPGA board
+( https://github.com/icebreaker-fpga/icebreaker ) but some might have
+other / multiple targets, check their respective README / build files
+
+Applicable license is individual to each IP core / project and is mentionnned
+in the IP core / example directory itself and in each file.

+ 15 - 0
build/core-magic.mk

@@ -0,0 +1,15 @@
+# Export core directory
+CORE_$(CORE)_DIR := $(abspath $(ROOT)/cores/$(CORE)/)
+
+# Make the sources path absolute
+RTL_SRCS_$(CORE) := $(addprefix $(CORE_$(CORE)_DIR)/,$(RTL_SRCS_$(CORE)))
+TB_SRCS_$(CORE)  := $(addprefix $(CORE_$(CORE)_DIR)/,$(TB_SRCS_$(CORE)))
+
+# Dependency collection target
+deps-core-$(CORE): $(addprefix deps-core-,$(DEPS_$(CORE)))
+	$(eval CORE := $(subst deps-core-,,$@))
+	$(eval DEPS_SOLVE_TMP += $(CORE))
+	$(eval SRCS_SOLVE_TMP += $(RTL_SRCS_$(CORE)))
+	$(eval PREREQ_SOLVE_TMP += $(PREREQ_$(CORE)))
+
+.PHONY: deps-core-$(CORE)

+ 49 - 0
build/core-rules.mk

@@ -0,0 +1,49 @@
+#
+# core-rules.mk
+#
+
+# Save value
+THIS_CORE := $(CORE)
+
+# Default tools
+IVERILOG ?= iverilog
+
+ICE40_LIBS ?= $(shell yosys-config --datdir/ice40/cells_sim.v)
+
+
+# Must be first rule and call it 'all' by convention
+all: sim
+
+# Root directory
+ROOT := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/..)
+
+# Temporary build-directory
+BUILD_TMP := $(abspath build-tmp)
+
+$(BUILD_TMP):
+	mkdir -p $(BUILD_TMP)
+
+# Discover all cores
+$(foreach core_dir, $(wildcard $(ROOT)/cores/*), $(eval include $(core_dir)/core.mk))
+
+# Resolve dependency tree for project and collect sources
+$(BUILD_TMP)/proj-deps.mk: Makefile $(BUILD_TMP) deps-core-$(THIS_CORE)
+	@echo "CORE_ALL_DEPS := $(DEPS_SOLVE_TMP)" > $@
+	@echo "CORE_ALL_SRCS := $(SRCS_SOLVE_TMP)" >> $@
+	@echo "CORE_ALL_PREREQ := $(PREREQ_SOLVE_TMP)" >> $@
+
+include $(BUILD_TMP)/proj-deps.mk
+
+# Simulation
+$(BUILD_TMP)/%_tb: sim/%_tb.v $(ICE40_LIBS) $(CORE_ALL_PREREQ) $(CORE_ALL_SRCS)
+	iverilog -Wall -DSIM=1 -o $@ $(ICE40_LIBS) $(CORE_ALL_SRCS) $<
+
+
+# Action targets
+sim: $(addprefix $(BUILD_TMP)/, $(TESTBENCHES_$(THIS_CORE)))
+
+clean:
+	@rm -Rf $(BUILD_TMP)
+
+
+.PHONY: all sim clean

+ 97 - 0
build/project-rules.mk

@@ -0,0 +1,97 @@
+#
+# project-rules.mk
+#
+
+# Default tools
+YOSYS ?= yosys
+YOSYS_READ_ARGS ?=
+YOSYS_SYNTH_ARGS ?= -dffe_min_ce_use 4 -relut
+NEXTPNR ?= nextpnr-ice40
+NEXTPNR_ARGS ?= --freq 50
+ICEPACK ?= icepack
+ICEPROG ?= iceprog
+IVERILOG ?= iverilog
+
+ICE40_LIBS ?= $(shell yosys-config --datdir/ice40/cells_sim.v)
+
+
+# Must be first rule and call it 'all' by convention
+all: synth
+
+# Root directory
+ROOT := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/..)
+
+# Temporary build-directory
+BUILD_TMP := $(abspath build-tmp)
+
+$(BUILD_TMP):
+	mkdir -p $(BUILD_TMP)
+
+# Discover all cores
+$(foreach core_dir, $(wildcard $(ROOT)/cores/*), $(eval include $(core_dir)/core.mk))
+
+# Resolve dependency tree for project and collect sources
+$(BUILD_TMP)/proj-deps.mk: Makefile $(BUILD_TMP) $(addprefix deps-core-,$(PROJ_DEPS))
+	@echo "PROJ_ALL_DEPS := $(DEPS_SOLVE_TMP)" > $@
+	@echo "PROJ_ALL_SRCS := $(SRCS_SOLVE_TMP)" >> $@
+	@echo "PROJ_ALL_PREREQ := $(PREREQ_SOLVE_TMP)" >> $@
+
+include $(BUILD_TMP)/proj-deps.mk
+
+# Make all sources absolute
+PROJ_RTL_SRCS := $(abspath $(PROJ_RTL_SRCS))
+PROJ_TOP_SRC  := $(abspath $(PROJ_TOP_SRC))
+
+PIN_DEF ?= $(abspath data/$(PROJ_TOP_MOD)-$(BOARD).pcf)
+
+# Add those to the list
+PROJ_ALL_SRCS += $(PROJ_RTL_SRCS)
+PROJ_ALL_PREREQ += $(PROJ_PREREQ)
+
+
+# Synthesis & Place-n-route rules
+
+$(BUILD_TMP)/$(PROJ).ys: $(PROJ_TOP_SRC) $(PROJ_ALL_SRCS)
+	@echo "read_verilog $(YOSYS_READ_ARGS) $(PROJ_TOP_SRC) $(PROJ_ALL_SRCS)" > $@
+	@echo "synth_ice40 $(YOSYS_SYNTH_ARGS) -top $(PROJ_TOP_MOD) -json $(PROJ).json" >> $@
+
+$(BUILD_TMP)/$(PROJ).synth.rpt $(BUILD_TMP)/$(PROJ).json: $(PROJ_ALL_PREREQ) $(BUILD_TMP)/$(PROJ).ys $(PROJ_ALL_SRCS)
+	cd $(BUILD_TMP) && \
+		$(YOSYS) -s $(BUILD_TMP)/$(PROJ).ys \
+			 -l $(BUILD_TMP)/$(PROJ).synth.rpt
+
+$(BUILD_TMP)/$(PROJ).pnr.rpt $(BUILD_TMP)/$(PROJ).asc: $(BUILD_TMP)/$(PROJ).json $(PIN_DEF)
+	$(NEXTPNR) $(NEXTPNR_ARGS) \
+		--$(DEVICE) --package $(PACKAGE)  \
+		-l $(BUILD_TMP)/$(PROJ).pnr.rpt \
+		--json $(BUILD_TMP)/$(PROJ).json \
+		--pcf $(PIN_DEF) \
+		--asc $@ 
+
+%.bin: %.asc
+	$(ICEPACK) -s $< $@
+
+
+# Simulation
+$(BUILD_TMP)/%_tb: sim/%_tb.v $(ICE40_LIBS) $(PROJ_ALL_PREREQ) $(PROJ_ALL_SRCS)
+	iverilog -Wall -DSIM=1 -o $@ $(ICE40_LIBS) $(PROJ_ALL_SRCS) $<
+
+
+# Action targets
+
+synth: $(BUILD_TMP)/$(PROJ).bin
+
+sim: $(addprefix $(BUILD_TMP)/, $(PROJ_TESTBENCHES))
+
+prog: $(BUILD_TMP)/$(PROJ).bin
+	$(ICEPROG) $<
+
+sudo-prog: $(BUILD_TMP)/$(PROJ).bin
+	@echo 'Executing prog as root!!!'
+	sudo $(ICEPROG) $<
+
+clean:
+	@rm -Rf $(BUILD_TMP)
+
+
+.PHONY: all synth sim prog sudo-prog clean


+ 0 - 0
projects/.keep