mirror of
https://github.com/YosysHQ/yosys
synced 2026-03-23 04:49:15 +00:00
Merge 0f1f20d0ed into 5fd39ff3e1
This commit is contained in:
commit
9191491eed
114 changed files with 1105 additions and 1095 deletions
2
.github/workflows/test-verific.yml
vendored
2
.github/workflows/test-verific.yml
vendored
|
|
@ -78,7 +78,7 @@ jobs:
|
|||
- name: Run Verific specific Yosys tests
|
||||
run: |
|
||||
make -C tests/sva
|
||||
cd tests/svtypes && bash run-test.sh
|
||||
make -C tests/svtypes
|
||||
|
||||
- name: Run SBY tests
|
||||
if: ${{ github.event_name == 'merge_group' || github.event_name == 'workflow_dispatch' }}
|
||||
|
|
|
|||
119
Makefile
119
Makefile
|
|
@ -918,110 +918,15 @@ else
|
|||
ABCOPT=""
|
||||
endif
|
||||
|
||||
# Tests that generate .mk with tests/gen-tests-makefile.sh
|
||||
MK_TEST_DIRS =
|
||||
MK_TEST_DIRS += tests/arch/analogdevices
|
||||
MK_TEST_DIRS += tests/arch/anlogic
|
||||
MK_TEST_DIRS += tests/arch/ecp5
|
||||
MK_TEST_DIRS += tests/arch/efinix
|
||||
MK_TEST_DIRS += tests/arch/gatemate
|
||||
MK_TEST_DIRS += tests/arch/gowin
|
||||
MK_TEST_DIRS += tests/arch/ice40
|
||||
MK_TEST_DIRS += tests/arch/intel_alm
|
||||
MK_TEST_DIRS += tests/arch/machxo2
|
||||
MK_TEST_DIRS += tests/arch/microchip
|
||||
MK_TEST_DIRS += tests/arch/nanoxplore
|
||||
MK_TEST_DIRS += tests/arch/nexus
|
||||
MK_TEST_DIRS += tests/arch/quicklogic/pp3
|
||||
MK_TEST_DIRS += tests/arch/quicklogic/qlf_k6n10f
|
||||
MK_TEST_DIRS += tests/arch/xilinx
|
||||
MK_TEST_DIRS += tests/bugpoint
|
||||
MK_TEST_DIRS += tests/opt
|
||||
MK_TEST_DIRS += tests/sat
|
||||
MK_TEST_DIRS += tests/sdc
|
||||
MK_TEST_DIRS += tests/sim
|
||||
MK_TEST_DIRS += tests/svtypes
|
||||
MK_TEST_DIRS += tests/techmap
|
||||
MK_TEST_DIRS += tests/various
|
||||
MK_TEST_DIRS += tests/rtlil
|
||||
ifeq ($(ENABLE_VERIFIC),1)
|
||||
ifneq ($(YOSYS_NOVERIFIC),1)
|
||||
MK_TEST_DIRS += tests/verific
|
||||
endif
|
||||
endif
|
||||
MK_TEST_DIRS += tests/verilog
|
||||
|
||||
# Tests that don't generate .mk
|
||||
SH_TEST_DIRS =
|
||||
SH_TEST_DIRS += tests/simple
|
||||
SH_TEST_DIRS += tests/simple_abc9
|
||||
SH_TEST_DIRS += tests/hana
|
||||
SH_TEST_DIRS += tests/asicworld
|
||||
# SH_TEST_DIRS += tests/realmath
|
||||
SH_TEST_DIRS += tests/share
|
||||
SH_TEST_DIRS += tests/opt_share
|
||||
SH_TEST_DIRS += tests/fsm
|
||||
SH_TEST_DIRS += tests/memlib
|
||||
SH_TEST_DIRS += tests/bram
|
||||
SH_TEST_DIRS += tests/svinterfaces
|
||||
SH_TEST_DIRS += tests/xprop
|
||||
SH_TEST_DIRS += tests/select
|
||||
SH_TEST_DIRS += tests/peepopt
|
||||
SH_TEST_DIRS += tests/proc
|
||||
SH_TEST_DIRS += tests/blif
|
||||
SH_TEST_DIRS += tests/arch
|
||||
SH_TEST_DIRS += tests/rpc
|
||||
SH_TEST_DIRS += tests/memfile
|
||||
SH_TEST_DIRS += tests/fmt
|
||||
SH_TEST_DIRS += tests/cxxrtl
|
||||
SH_TEST_DIRS += tests/liberty
|
||||
ifeq ($(ENABLE_FUNCTIONAL_TESTS),1)
|
||||
SH_TEST_DIRS += tests/functional
|
||||
endif
|
||||
|
||||
# Tests that don't generate .mk and need special args
|
||||
SH_ABC_TEST_DIRS =
|
||||
SH_ABC_TEST_DIRS += tests/memories
|
||||
SH_ABC_TEST_DIRS += tests/aiger
|
||||
SH_ABC_TEST_DIRS += tests/alumacc
|
||||
|
||||
# seed-tests/ is a dummy string, not a directory
|
||||
.PHONY: seed-tests
|
||||
seed-tests: $(SH_TEST_DIRS:%=seed-tests/%)
|
||||
.PHONY: seed-tests/%
|
||||
seed-tests/%: %/run-test.sh $(TARGETS) $(EXTRA_TARGETS)
|
||||
+cd $* && bash run-test.sh $(SEEDOPT)
|
||||
+@echo "...passed tests in $*"
|
||||
|
||||
# abcopt-tests/ is a dummy string, not a directory
|
||||
.PHONY: abcopt-tests
|
||||
abcopt-tests: $(SH_ABC_TEST_DIRS:%=abcopt-tests/%)
|
||||
abcopt-tests/%: %/run-test.sh $(TARGETS) $(EXTRA_TARGETS)
|
||||
+cd $* && bash run-test.sh $(ABCOPT) $(SEEDOPT)
|
||||
+@echo "...passed tests in $*"
|
||||
|
||||
# makefile-tests/ is a dummy string, not a directory
|
||||
.PHONY: makefile-tests
|
||||
makefile-tests: $(MK_TEST_DIRS:%=makefile-tests/%)
|
||||
# this target actually emits .mk files
|
||||
%.mk:
|
||||
+cd $(dir $*) && bash run-test.sh
|
||||
# this one spawns submake on each
|
||||
makefile-tests/%: %/run-test.mk $(TARGETS) $(EXTRA_TARGETS)
|
||||
$(MAKE) -C $* -f run-test.mk
|
||||
+@echo "...passed tests in $*"
|
||||
|
||||
test: vanilla-test unit-test
|
||||
|
||||
vanilla-test: makefile-tests abcopt-tests seed-tests
|
||||
@echo ""
|
||||
@echo " Passed \"make vanilla-test\"."
|
||||
ifeq ($(ENABLE_VERIFIC),1)
|
||||
ifeq ($(YOSYS_NOVERIFIC),1)
|
||||
@echo " Ran tests without verific support due to YOSYS_NOVERIFIC=1."
|
||||
endif
|
||||
endif
|
||||
@echo ""
|
||||
.PHONY: vanilla-test
|
||||
|
||||
vanilla-test: $(TARGETS) $(EXTRA_TARGETS)
|
||||
@$(MAKE) -C tests vanilla-test \
|
||||
$(if $(ENABLE_VERIFIC),ENABLE_VERIFIC=$(ENABLE_VERIFIC)) \
|
||||
$(if $(YOSYS_NOVERIFIC),YOSYS_NOVERIFIC=$(YOSYS_NOVERIFIC)) \
|
||||
SEEDOPT=$(SEEDOPT) ABCOPT=$(ABCOPT)
|
||||
|
||||
VALGRIND ?= valgrind --error-exitcode=1 --leak-check=full --show-reachable=yes --errors-for-leak-kinds=all
|
||||
|
||||
|
|
@ -1187,16 +1092,8 @@ clean: clean-py clean-unit-test
|
|||
rm -f $(OBJS) $(GENFILES) $(TARGETS) $(EXTRA_TARGETS) $(EXTRA_OBJS)
|
||||
rm -f kernel/version_*.o kernel/version_*.cc
|
||||
rm -f libs/*/*.d frontends/*/*.d passes/*/*.d backends/*/*.d kernel/*.d techlibs/*/*.d
|
||||
rm -rf tests/asicworld/*.out tests/asicworld/*.log
|
||||
rm -rf tests/hana/*.out tests/hana/*.log
|
||||
rm -rf tests/simple/*.out tests/simple/*.log
|
||||
rm -rf tests/memories/*.out tests/memories/*.log tests/memories/*.dmp
|
||||
rm -rf tests/sat/*.log tests/techmap/*.log tests/various/*.log
|
||||
rm -rf tests/bram/temp tests/fsm/temp tests/realmath/temp tests/share/temp tests/smv/temp tests/various/temp
|
||||
rm -rf vloghtb/Makefile vloghtb/refdat vloghtb/rtl vloghtb/scripts vloghtb/spec vloghtb/check_yosys vloghtb/vloghammer_tb.tar.bz2 vloghtb/temp vloghtb/log_test_*
|
||||
rm -f tests/svinterfaces/*.log_stdout tests/svinterfaces/*.log_stderr tests/svinterfaces/dut_result.txt tests/svinterfaces/reference_result.txt tests/svinterfaces/a.out tests/svinterfaces/*_syn.v tests/svinterfaces/*.diff
|
||||
rm -f tests/tools/cmp_tbdata
|
||||
rm -f $(addsuffix /run-test.mk,$(MK_TEST_DIRS))
|
||||
-$(MAKE) -C $(YOSYS_SRC)/tests clean
|
||||
-$(MAKE) -C $(YOSYS_SRC)/docs clean
|
||||
rm -rf docs/util/__pycache__
|
||||
rm -f libyosys.so
|
||||
|
|
|
|||
2
tests/.gitignore
vendored
2
tests/.gitignore
vendored
|
|
@ -2,3 +2,5 @@
|
|||
*.out
|
||||
*.err
|
||||
run-test.mk
|
||||
**/Makefile
|
||||
*.result
|
||||
|
|
|
|||
133
tests/Makefile
Normal file
133
tests/Makefile
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
ifneq ($(wildcard ../Makefile.conf),)
|
||||
include ../Makefile.conf
|
||||
endif
|
||||
|
||||
OVERRIDE_MAIN=1
|
||||
include ./common.mk
|
||||
|
||||
# Directories with tests not run:
|
||||
# errors
|
||||
# lut
|
||||
# pyosys
|
||||
# smv
|
||||
# sva
|
||||
# tools
|
||||
# unit
|
||||
# vloghtb
|
||||
|
||||
# Tests that generate Makefile with gen_tests_makefile.py
|
||||
MK_TEST_DIRS =
|
||||
MK_TEST_DIRS += ./arch/analogdevices
|
||||
MK_TEST_DIRS += ./arch/anlogic
|
||||
MK_TEST_DIRS += ./arch/ecp5
|
||||
MK_TEST_DIRS += ./arch/efinix
|
||||
MK_TEST_DIRS += ./arch/fabulous
|
||||
MK_TEST_DIRS += ./arch/gatemate
|
||||
MK_TEST_DIRS += ./arch/gowin
|
||||
MK_TEST_DIRS += ./arch/ice40
|
||||
MK_TEST_DIRS += ./arch/intel_alm
|
||||
MK_TEST_DIRS += ./arch/machxo2
|
||||
MK_TEST_DIRS += ./arch/microchip
|
||||
MK_TEST_DIRS += ./arch/nanoxplore
|
||||
MK_TEST_DIRS += ./arch/nexus
|
||||
MK_TEST_DIRS += ./arch/quicklogic/pp3
|
||||
MK_TEST_DIRS += ./arch/quicklogic/qlf_k6n10f
|
||||
MK_TEST_DIRS += ./arch/xilinx
|
||||
MK_TEST_DIRS += ./bind
|
||||
MK_TEST_DIRS += ./bugpoint
|
||||
MK_TEST_DIRS += ./opt
|
||||
MK_TEST_DIRS += ./sat
|
||||
MK_TEST_DIRS += ./sdc
|
||||
MK_TEST_DIRS += ./sim
|
||||
MK_TEST_DIRS += ./svtypes
|
||||
MK_TEST_DIRS += ./techmap
|
||||
MK_TEST_DIRS += ./various
|
||||
MK_TEST_DIRS += ./rtlil
|
||||
ifeq ($(ENABLE_VERIFIC),1)
|
||||
ifneq ($(YOSYS_NOVERIFIC),1)
|
||||
MK_TEST_DIRS += ./verific
|
||||
endif
|
||||
endif
|
||||
MK_TEST_DIRS += ./verilog
|
||||
|
||||
# Tests that don't generate .mk
|
||||
SH_TEST_DIRS =
|
||||
MK_TEST_DIRS += ./simple
|
||||
MK_TEST_DIRS += ./simple_abc9
|
||||
MK_TEST_DIRS += ./hana
|
||||
MK_TEST_DIRS += ./asicworld
|
||||
#SH_TEST_DIRS += ./realmath
|
||||
MK_TEST_DIRS += ./share
|
||||
MK_TEST_DIRS += ./opt_share
|
||||
MK_TEST_DIRS += ./fsm
|
||||
MK_TEST_DIRS += ./memlib
|
||||
MK_TEST_DIRS += ./bram
|
||||
#SH_TEST_DIRS += ./svinterfaces
|
||||
MK_TEST_DIRS += ./xprop
|
||||
MK_TEST_DIRS += ./select
|
||||
MK_TEST_DIRS += ./peepopt
|
||||
MK_TEST_DIRS += ./proc
|
||||
MK_TEST_DIRS += ./blif
|
||||
#SH_TEST_DIRS += ./arch
|
||||
#SH_TEST_DIRS += ./rpc
|
||||
MK_TEST_DIRS += ./memfile
|
||||
#SH_TEST_DIRS += ./fmt
|
||||
#SH_TEST_DIRS += ./cxxrtl
|
||||
#SH_TEST_DIRS += ./liberty
|
||||
#ifeq ($(ENABLE_FUNCTIONAL_TESTS),1)
|
||||
#SH_TEST_DIRS += ./functional
|
||||
#endif
|
||||
|
||||
# Tests that don't generate .mk and need special args
|
||||
MK_TEST_DIRS += ./memories
|
||||
MK_TEST_DIRS += ./aiger
|
||||
MK_TEST_DIRS += ./alumacc
|
||||
|
||||
all: vanilla-test
|
||||
|
||||
# seed-./ is a dummy string, not a directory
|
||||
.PHONY: seed-tests
|
||||
seed-tests: $(SH_TEST_DIRS:%=seed-./%)
|
||||
.PHONY: seed-./%
|
||||
seed-./%: %/run-test.sh
|
||||
+cd $* && bash run-test.sh $(SEEDOPT)
|
||||
+@echo "...passed tests in $*"
|
||||
|
||||
# makefile-./ is a dummy string, not a directory
|
||||
.PHONY: makefile-tests
|
||||
.SILENT: $(MK_TEST_DIRS:%=%/Makefile)
|
||||
makefile-tests: $(MK_TEST_DIRS:%=makefile-./%)
|
||||
prep: $(MK_TEST_DIRS:%=%/Makefile)
|
||||
@echo "All Makefiles generated."
|
||||
|
||||
.PHONY: force-create
|
||||
# this target actually emits Makefile files
|
||||
%/Makefile: force-create
|
||||
+@cd $* && python3 generate_mk.py
|
||||
|
||||
makefile-./%: %/Makefile
|
||||
@$(MAKE) -C $*
|
||||
@echo "...passed tests in $*"
|
||||
|
||||
vanilla-test: makefile-tests seed-tests
|
||||
@echo ""
|
||||
@echo " Passed \"make vanilla-test\"."
|
||||
ifeq ($(ENABLE_VERIFIC),1)
|
||||
ifeq ($(YOSYS_NOVERIFIC),1)
|
||||
@echo " Ran tests without verific support due to YOSYS_NOVERIFIC=1."
|
||||
endif
|
||||
endif
|
||||
@echo ""
|
||||
-@$(MAKE) --no-print-directory summary
|
||||
|
||||
clean:
|
||||
@rm -rf ./asicworld/*.out ./asicworld/*.log
|
||||
@rm -rf ./hana/*.out ./hana/*.log
|
||||
@rm -rf ./simple/*.out ./simple/*.log
|
||||
@rm -rf ./memories/*.out ./memories/*.log ./memories/*.dmp
|
||||
@rm -rf ./sat/*.log ./techmap/*.log ./various/*.log
|
||||
@rm -rf ./bram/temp ./fsm/temp ./realmath/temp ./share/temp ./smv/temp ./various/temp
|
||||
@rm -f ./svinterfaces/*.log_stdout ./svinterfaces/*.log_stderr ./svinterfaces/dut_result.txt ./svinterfaces/reference_result.txt ./svinterfaces/a.out ./svinterfaces/*_syn.v ./svinterfaces/*.diff
|
||||
@rm -f ./tools/cmp_tbdata
|
||||
@rm -f $(addsuffix /Makefile,$(MK_TEST_DIRS))
|
||||
@find . -name '*.result' -type f -exec rm -f {} +
|
||||
58
tests/aiger/generate_mk.py
Normal file
58
tests/aiger/generate_mk.py
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
import glob
|
||||
import os
|
||||
|
||||
def base(fn):
|
||||
return os.path.splitext(fn)[0]
|
||||
|
||||
# NB: *.aag and *.aig must contain a symbol table naming the primary
|
||||
# inputs and outputs, otherwise ABC and Yosys will name them
|
||||
# arbitrarily (and inconsistently with each other).
|
||||
|
||||
# Since ABC cannot read *.aag, read the *.aig instead
|
||||
# (which would have been created by the reference aig2aig utility,
|
||||
# available from http://fmv.jku.at/aiger/)
|
||||
def create_tests():
|
||||
aags = sorted(glob.glob("*.aag"))
|
||||
yss = sorted(glob.glob("*.ys"))
|
||||
for aag in aags:
|
||||
b = base(aag)
|
||||
|
||||
cmd = [
|
||||
f"$(ABC) -q \"read -c {b}.aig; write {b}_ref.v\" >/dev/null 2>&1;",
|
||||
"$(YOSYS) -qp \"",
|
||||
f"read_verilog {b}_ref.v;",
|
||||
"prep;",
|
||||
"design -stash gold;",
|
||||
f"read_aiger -clk_name clock {aag};",
|
||||
"prep;",
|
||||
"design -stash gate;",
|
||||
"design -import gold -as gold;",
|
||||
"design -import gate -as gate;",
|
||||
"miter -equiv -flatten -make_assert -make_outputs gold gate miter;",
|
||||
"sat -verify -prove-asserts -show-ports -seq 16 miter;",
|
||||
f"\" -l {aag}.log >/dev/null 2>&1"
|
||||
]
|
||||
|
||||
gen_tests_makefile.generate_cmd_test(aag, cmd)
|
||||
|
||||
# ---- Yosys script tests ----
|
||||
for ys in yss:
|
||||
gen_tests_makefile.generate_ys_test(ys)
|
||||
|
||||
cmd = [ "rm -rf gate; mkdir gate;",
|
||||
"$(YOSYS) --no-version -p \"test_cell -aigmap -w gate/ -n 1 -s 1 all\" >/dev/null 2>&1;",
|
||||
"set -o pipefail; diff --brief gold gate | tee aigmap.err;",
|
||||
"rm -f aigmap.err" ]
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("aigmap", cmd)
|
||||
|
||||
extra = [ f"ABC ?= {gen_tests_makefile.yosys_basedir}/yosys-abc" ]
|
||||
|
||||
gen_tests_makefile.generate_custom(create_tests, extra)
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
set -e
|
||||
|
||||
OPTIND=1
|
||||
abcprog="../../yosys-abc" # default to built-in version of abc
|
||||
while getopts "A:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
A) abcprog="$OPTARG" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
# NB: *.aag and *.aig must contain a symbol table naming the primary
|
||||
# inputs and outputs, otherwise ABC and Yosys will name them
|
||||
# arbitrarily (and inconsistently with each other).
|
||||
|
||||
for aag in *.aag; do
|
||||
# Since ABC cannot read *.aag, read the *.aig instead
|
||||
# (which would have been created by the reference aig2aig utility,
|
||||
# available from http://fmv.jku.at/aiger/)
|
||||
echo "Checking $aag."
|
||||
$abcprog -q "read -c ${aag%.*}.aig; write ${aag%.*}_ref.v"
|
||||
../../yosys -qp "
|
||||
read_verilog ${aag%.*}_ref.v
|
||||
prep
|
||||
design -stash gold
|
||||
read_aiger -clk_name clock $aag
|
||||
prep
|
||||
design -stash gate
|
||||
design -import gold -as gold
|
||||
design -import gate -as gate
|
||||
miter -equiv -flatten -make_assert -make_outputs gold gate miter
|
||||
sat -verify -prove-asserts -show-ports -seq 16 miter
|
||||
" -l ${aag}.log
|
||||
done
|
||||
|
||||
for aig in *.aig; do
|
||||
echo "Checking $aig."
|
||||
$abcprog -q "read -c $aig; write ${aig%.*}_ref.v"
|
||||
../../yosys -qp "
|
||||
read_verilog ${aig%.*}_ref.v
|
||||
prep
|
||||
design -stash gold
|
||||
read_aiger -clk_name clock $aig
|
||||
prep
|
||||
design -stash gate
|
||||
design -import gold -as gold
|
||||
design -import gate -as gate
|
||||
miter -equiv -flatten -make_assert -make_outputs gold gate miter
|
||||
sat -verify -prove-asserts -show-ports -seq 16 miter
|
||||
" -l ${aig}.log
|
||||
done
|
||||
|
||||
for y in *.ys; do
|
||||
echo "Running $y."
|
||||
../../yosys -ql ${y%.*}.log $y
|
||||
done
|
||||
|
||||
# compare aigmap with reference
|
||||
# make gold with: rm gold/*; yosys --no-version -p "test_cell -aigmap -w gold/ -n 1 -s 1 all"
|
||||
rm -rf gate; mkdir gate
|
||||
../../yosys --no-version -p "test_cell -aigmap -w gate/ -n 1 -s 1 all"
|
||||
(
|
||||
set -o pipefail
|
||||
diff --brief gold gate | tee aigmap.err
|
||||
)
|
||||
rm aigmap.err
|
||||
8
tests/alumacc/generate_mk.py
Normal file
8
tests/alumacc/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
set -e
|
||||
for x in *.ys; do
|
||||
echo "Running $x.."
|
||||
../../yosys -ql ${x%.ys}.log $x
|
||||
done
|
||||
9
tests/arch/analogdevices/generate_mk.py
Normal file
9
tests/arch/analogdevices/generate_mk.py
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
import mem_gen
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
python3 mem_gen.py
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash
|
||||
8
tests/arch/anlogic/generate_mk.py
Normal file
8
tests/arch/anlogic/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/arch/ecp5/generate_mk.py
Normal file
8
tests/arch/ecp5/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/arch/efinix/generate_mk.py
Normal file
8
tests/arch/efinix/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
|
|
@ -11,9 +11,9 @@ sat -verify -prove-asserts -show-public -set-at 1 in_reset 1 -seq 20 -prove-skip
|
|||
|
||||
design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design)
|
||||
cd fsm # Constrain all select calls below inside the top module
|
||||
|
||||
stat
|
||||
select -assert-count 6 t:LUTFF
|
||||
select -assert-max 4 t:LUT2
|
||||
select -assert-max 2 t:LUT3
|
||||
select -assert-max 9 t:LUT4
|
||||
select -assert-max 5 t:LUT2
|
||||
select -assert-max 4 t:LUT3
|
||||
select -assert-max 8 t:LUT4
|
||||
select -assert-none t:LUT2 t:LUT3 t:LUT4 t:LUTFF %% t:* %D
|
||||
|
|
|
|||
8
tests/arch/fabulous/generate_mk.py
Normal file
8
tests/arch/fabulous/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
8
tests/arch/gatemate/generate_mk.py
Normal file
8
tests/arch/gatemate/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/arch/gowin/generate_mk.py
Normal file
8
tests/arch/gowin/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/arch/ice40/generate_mk.py
Normal file
8
tests/arch/ice40/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/arch/intel_alm/generate_mk.py
Normal file
8
tests/arch/intel_alm/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/arch/machxo2/generate_mk.py
Normal file
8
tests/arch/machxo2/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/arch/microchip/generate_mk.py
Normal file
8
tests/arch/microchip/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/arch/nanoxplore/generate_mk.py
Normal file
8
tests/arch/nanoxplore/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/arch/nexus/generate_mk.py
Normal file
8
tests/arch/nexus/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/arch/quicklogic/pp3/generate_mk.py
Normal file
8
tests/arch/quicklogic/pp3/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
9
tests/arch/quicklogic/qlf_k6n10f/generate_mk.py
Normal file
9
tests/arch/quicklogic/qlf_k6n10f/generate_mk.py
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
import mem_gen
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
python3 mem_gen.py
|
||||
source ../../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash
|
||||
|
|
@ -12,12 +12,12 @@ for arch in ../../techlibs/*; do
|
|||
if [ "${defines[$arch_name]}" ]; then
|
||||
for def in ${defines[$arch_name]}; do
|
||||
echo -n "Test $path -D$def ->"
|
||||
iverilog -t null -I$arch -D$def -DNO_ICE40_DEFAULT_ASSIGNMENTS $path
|
||||
iverilog -t null -I$arch -D$def -DNO_ICE40_DEFAULT_ASSIGNMENTS $path >/dev/null 2>&1
|
||||
echo " ok"
|
||||
done
|
||||
else
|
||||
echo -n "Test $path ->"
|
||||
iverilog -t null -I$arch -g2005-sv $path
|
||||
iverilog -t null -I$arch -g2005-sv $path >/dev/null 2>&1
|
||||
echo " ok"
|
||||
fi
|
||||
done
|
||||
|
|
@ -25,6 +25,6 @@ done
|
|||
|
||||
for path in "../../techlibs/common/simcells.v" "../../techlibs/common/simlib.v"; do
|
||||
echo -n "Test $path ->"
|
||||
iverilog -t null $path
|
||||
iverilog -t null $path >/dev/null 2>&1
|
||||
echo " ok"
|
||||
done
|
||||
|
|
|
|||
8
tests/arch/xilinx/generate_mk.py
Normal file
8
tests/arch/xilinx/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("../..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
8
tests/asicworld/generate_mk.py
Normal file
8
tests/asicworld/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate_autotest("*.v", "-e")
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
OPTIND=1
|
||||
seed="" # default to no seed specified
|
||||
while getopts "S:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
S) arg="${OPTARG#"${OPTARG%%[![:space:]]*}"}" # remove leading space
|
||||
seed="SEED=$arg" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
exec ${MAKE:-make} -f ../tools/autotest.mk $seed EXTRA_FLAGS+="-e" *.v
|
||||
8
tests/bind/generate_mk.py
Normal file
8
tests/bind/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
{
|
||||
echo "all::"
|
||||
for x in *.ys; do
|
||||
echo "all:: run-$x"
|
||||
echo "run-$x:"
|
||||
echo " @echo 'Running $x..'"
|
||||
echo " @../../yosys -ql ${x%.ys}.log $x"
|
||||
done
|
||||
for s in *.sh; do
|
||||
if [ "$s" != "run-test.sh" ]; then
|
||||
echo "all:: run-$s"
|
||||
echo "run-$s:"
|
||||
echo " @echo 'Running $s..'"
|
||||
echo " @bash $s"
|
||||
fi
|
||||
done
|
||||
} > run-test.mk
|
||||
exec ${MAKE:-make} -f run-test.mk
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
# Generated by Yosys
|
||||
|
||||
.model test
|
||||
.inputs clk in_a_var[0] in_a_var[1] in_a_var[2] in_a_var[3] in_a_var[4] in_a_var[5] in_a_var[6] in_a_var[7] in_b_var[0] in_b_var[1] in_b_var[2] in_b_var[3] in_b_var[4] in_b_var[5] in_b_var[6] in_b_var[7]
|
||||
|
|
|
|||
|
|
@ -1,2 +1,4 @@
|
|||
read_blif gatesi.blif
|
||||
write_blif -gatesi gatesi.blif.out
|
||||
write_blif -gatesi gatesi.blif.out
|
||||
! tail -n +2 gatesi.blif.out > gatesi.blif.out.tmp && mv gatesi.blif.out.tmp gatesi.blif.out
|
||||
! diff gatesi.blif.out gatesi.blif.ok
|
||||
|
|
|
|||
8
tests/blif/generate_mk.py
Normal file
8
tests/blif/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
set -e
|
||||
for x in *.ys; do
|
||||
echo "Running $x.."
|
||||
../../yosys --no-version -ql ${x%.ys}.log $x
|
||||
done
|
||||
|
||||
for x in *.blif; do
|
||||
diff $x.out $x.ok
|
||||
done
|
||||
|
|
@ -4,6 +4,10 @@ import argparse
|
|||
import os
|
||||
import sys
|
||||
import random
|
||||
import glob
|
||||
|
||||
sys.path.append("..")
|
||||
import gen_tests_makefile
|
||||
|
||||
debug_mode = False
|
||||
|
||||
|
|
@ -287,9 +291,11 @@ if args.seed is not None:
|
|||
else:
|
||||
seed = (int(os.times()[4]*100) + os.getpid()) % 900000 + 100000
|
||||
|
||||
print("PRNG seed: %d" % seed)
|
||||
print("bram PRNG seed: %d" % seed)
|
||||
random.seed(seed)
|
||||
|
||||
os.makedirs("temp", exist_ok=True)
|
||||
|
||||
for k1 in range(args.count):
|
||||
dsc_f = open("temp/brams_%02d.txt" % k1, "w")
|
||||
sim_f = open("temp/brams_%02d.v" % k1, "w")
|
||||
|
|
@ -303,3 +309,19 @@ for k1 in range(args.count):
|
|||
for k2 in range(lenk2):
|
||||
create_bram(dsc_f, sim_f, ref_f, tb_f, k1, k2, random.randrange(2 if k2+1 < lenk2 else 1))
|
||||
|
||||
configs = sorted(set(
|
||||
os.path.basename(f).replace("brams_", "").replace(".txt", "")
|
||||
for f in glob.glob("temp/brams_*.txt")
|
||||
))
|
||||
|
||||
def create_tests():
|
||||
for i in configs:
|
||||
for j in configs:
|
||||
if i != j:
|
||||
gen_tests_makefile.generate_cmd_test(
|
||||
f"bram_{i}_{j}",
|
||||
f"bash run-single.sh {i} {j} >/dev/null 2>&1"
|
||||
)
|
||||
|
||||
gen_tests_makefile.generate_custom(create_tests)
|
||||
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
# run this test many times:
|
||||
# MAKE="make -j8" time bash -c 'for ((i=0; i<100; i++)); do echo "-- $i --"; bash run-test.sh || exit 1; done'
|
||||
|
||||
set -e
|
||||
|
||||
OPTIND=1
|
||||
count=5
|
||||
seed="" # default to no seed specified
|
||||
debug=""
|
||||
while getopts "c:dS:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
c) count="$OPTARG" ;;
|
||||
d) debug="-d" ;;
|
||||
S) seed="-S $OPTARG" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
rm -rf temp
|
||||
mkdir -p temp
|
||||
|
||||
echo "generating tests.."
|
||||
python3 generate.py $debug -c $count $seed
|
||||
|
||||
{
|
||||
echo -n "all:"
|
||||
for i in $( ls temp/brams_*.txt | sed 's,.*_,,; s,\..*,,;' ); do
|
||||
for j in $( ls temp/brams_*.txt | sed 's,.*_,,; s,\..*,,;' | grep -v $i ); do
|
||||
echo -n " temp/job_${i}_${j}.ok"
|
||||
done; done
|
||||
echo
|
||||
for i in $( ls temp/brams_*.txt | sed 's,.*_,,; s,\..*,,;' ); do
|
||||
for j in $( ls temp/brams_*.txt | sed 's,.*_,,; s,\..*,,;' | grep -v $i ); do
|
||||
echo "temp/job_${i}_${j}.ok:"
|
||||
echo " @bash run-single.sh ${i} ${j}"
|
||||
echo " @echo 'Passed memory_bram test ${i}_${j}.'"
|
||||
echo " @touch \$@"
|
||||
done; done
|
||||
} > temp/makefile
|
||||
|
||||
echo "running tests.."
|
||||
${MAKE:-make} -f temp/makefile
|
||||
|
||||
exit 0
|
||||
8
tests/bugpoint/generate_mk.py
Normal file
8
tests/bugpoint/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts
|
||||
44
tests/common.mk
Normal file
44
tests/common.mk
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
all:
|
||||
|
||||
ifndef OVERRIDE_MAIN
|
||||
clean:
|
||||
@rm -f *.log *.result
|
||||
endif
|
||||
|
||||
define run_test
|
||||
@set -e; \
|
||||
rc=0; \
|
||||
( set -e; $(2) ) || rc=$$?; \
|
||||
if [ $$rc -eq 0 ]; then \
|
||||
echo "PASS $1"; \
|
||||
echo PASS > $1.result; \
|
||||
else \
|
||||
echo "FAIL $1"; \
|
||||
echo FAIL > $1.result; \
|
||||
fi
|
||||
endef
|
||||
|
||||
.PHONY: summary
|
||||
summary:
|
||||
@pass=$$(find . -type f -name '*.result' -exec grep '^PASS$$' {} + | wc -l); \
|
||||
fail=$$(find . -type f -name '*.result' -exec grep '^FAIL$$' {} + | wc -l); \
|
||||
total=$$((pass + fail)); \
|
||||
echo "=========================="; \
|
||||
echo "Tests: $$total"; \
|
||||
echo "Passed: $$pass"; \
|
||||
echo "Failed: $$fail"; \
|
||||
echo "=========================="; \
|
||||
if [ $$fail -ne 0 ]; then \
|
||||
echo; \
|
||||
$(MAKE) --no-print-directory report; \
|
||||
fi; \
|
||||
test $$fail -eq 0
|
||||
|
||||
.PHONY: report
|
||||
report:
|
||||
@echo "=========================="
|
||||
@echo "Failing tests:"
|
||||
@find . -name '*.result' -type f -exec grep -H '^FAIL$$' {} + \
|
||||
| cut -d: -f1 \
|
||||
| sed 's|^\./||; s|\.result$$||'
|
||||
@echo "=========================="
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/bash
|
||||
source ../common-env.sh
|
||||
|
||||
set -ex
|
||||
set -e
|
||||
|
||||
run_subtest () {
|
||||
local subtest=$1; shift
|
||||
|
|
@ -14,5 +14,5 @@ run_subtest value
|
|||
run_subtest value_fuzz
|
||||
|
||||
# Compile-only test.
|
||||
../../yosys -p "read_verilog test_unconnected_output.v; select =*; proc; clean; write_cxxrtl cxxrtl-test-unconnected_output.cc"
|
||||
../../yosys -p "read_verilog test_unconnected_output.v; select =*; proc; clean; write_cxxrtl cxxrtl-test-unconnected_output.cc" >/dev/null 2>&1
|
||||
${CXX:-g++} -std=c++11 -c -o cxxrtl-test-unconnected_output -I../../backends/cxxrtl/runtime cxxrtl-test-unconnected_output.cc
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
set -ex
|
||||
set -e
|
||||
|
||||
../../yosys -p 'read_verilog initial_display.v' | awk '/<<<BEGIN>>>/,/<<<END>>>/ {print $0}' >yosys-initial_display.log
|
||||
../../yosys -p 'read_verilog initial_display.v' | awk '/<<<BEGIN>>>/,/<<<END>>>/ {print $0}' >yosys-initial_display.log 2>&1
|
||||
iverilog -o iverilog-initial_display initial_display.v
|
||||
./iverilog-initial_display >iverilog-initial_display.log
|
||||
diff yosys-initial_display.log iverilog-initial_display.log
|
||||
|
||||
test_always_display () {
|
||||
local subtest=$1; shift
|
||||
../../yosys -p "read_verilog $* always_display.v; proc; opt_expr -mux_bool; clean" -o yosys-always_display-${subtest}-1.v
|
||||
../../yosys -p "read_verilog yosys-always_display-${subtest}-1.v; proc; opt_expr -mux_bool; clean" -o yosys-always_display-${subtest}-2.v
|
||||
../../yosys -p "read_verilog $* always_display.v; proc; opt_expr -mux_bool; clean" -o yosys-always_display-${subtest}-1.v >/dev/null 2>&1
|
||||
../../yosys -p "read_verilog yosys-always_display-${subtest}-1.v; proc; opt_expr -mux_bool; clean" -o yosys-always_display-${subtest}-2.v >/dev/null 2>&1
|
||||
diff yosys-always_display-${subtest}-1.v yosys-always_display-${subtest}-2.v
|
||||
}
|
||||
|
||||
|
|
@ -25,15 +25,15 @@ test_always_display star_en -DEVENT_STAR -DCOND_EN
|
|||
|
||||
test_roundtrip () {
|
||||
local subtest=$1; shift
|
||||
../../yosys -p "read_verilog $* roundtrip.v; proc; clean" -o yosys-roundtrip-${subtest}-1.v
|
||||
../../yosys -p "read_verilog yosys-roundtrip-${subtest}-1.v; proc; clean" -o yosys-roundtrip-${subtest}-2.v
|
||||
../../yosys -p "read_verilog $* roundtrip.v; proc; clean" -o yosys-roundtrip-${subtest}-1.v >/dev/null 2>&1
|
||||
../../yosys -p "read_verilog yosys-roundtrip-${subtest}-1.v; proc; clean" -o yosys-roundtrip-${subtest}-2.v >/dev/null 2>&1
|
||||
diff yosys-roundtrip-${subtest}-1.v yosys-roundtrip-${subtest}-2.v
|
||||
|
||||
iverilog $* -o iverilog-roundtrip-${subtest} roundtrip.v roundtrip_tb.v
|
||||
iverilog $* -o iverilog-roundtrip-${subtest} roundtrip.v roundtrip_tb.v >/dev/null 2>&1
|
||||
./iverilog-roundtrip-${subtest} >iverilog-roundtrip-${subtest}.log
|
||||
iverilog $* -o iverilog-roundtrip-${subtest}-1 yosys-roundtrip-${subtest}-1.v roundtrip_tb.v
|
||||
iverilog $* -o iverilog-roundtrip-${subtest}-1 yosys-roundtrip-${subtest}-1.v roundtrip_tb.v >/dev/null 2>&1
|
||||
./iverilog-roundtrip-${subtest}-1 >iverilog-roundtrip-${subtest}-1.log
|
||||
iverilog $* -o iverilog-roundtrip-${subtest}-2 yosys-roundtrip-${subtest}-2.v roundtrip_tb.v
|
||||
iverilog $* -o iverilog-roundtrip-${subtest}-2 yosys-roundtrip-${subtest}-2.v roundtrip_tb.v >/dev/null 2>&1
|
||||
./iverilog-roundtrip-${subtest}-1 >iverilog-roundtrip-${subtest}-2.log
|
||||
diff iverilog-roundtrip-${subtest}.log iverilog-roundtrip-${subtest}-1.log
|
||||
diff iverilog-roundtrip-${subtest}-1.log iverilog-roundtrip-${subtest}-2.log
|
||||
|
|
@ -51,10 +51,10 @@ test_roundtrip bin_signed -DBASE_HEX -DSIGN="signed"
|
|||
test_cxxrtl () {
|
||||
local subtest=$1; shift
|
||||
|
||||
../../yosys -p "read_verilog ${subtest}.v; proc; clean; write_cxxrtl -print-output std::cerr yosys-${subtest}.cc"
|
||||
../../yosys -p "read_verilog ${subtest}.v; proc; clean; write_cxxrtl -print-output std::cerr yosys-${subtest}.cc" >/dev/null 2>&1
|
||||
${CXX:-g++} -std=c++11 -o yosys-${subtest} -I../../backends/cxxrtl/runtime ${subtest}_tb.cc -lstdc++
|
||||
./yosys-${subtest} 2>yosys-${subtest}.log
|
||||
iverilog -o iverilog-${subtest} ${subtest}.v ${subtest}_tb.v
|
||||
iverilog -o iverilog-${subtest} ${subtest}.v ${subtest}_tb.v >/dev/null 2>&1
|
||||
./iverilog-${subtest} |grep -v '\$finish called' >iverilog-${subtest}.log
|
||||
diff iverilog-${subtest}.log yosys-${subtest}.log
|
||||
}
|
||||
|
|
@ -63,16 +63,16 @@ test_cxxrtl always_full
|
|||
test_cxxrtl always_comb
|
||||
|
||||
# Ensure Verilog backend preserves behaviour of always block with multiple $displays.
|
||||
../../yosys -p "read_verilog always_full.v; prep; clean" -o yosys-always_full-1.v
|
||||
iverilog -o iverilog-always_full-1 yosys-always_full-1.v always_full_tb.v
|
||||
../../yosys -p "read_verilog always_full.v; prep; clean" -o yosys-always_full-1.v >/dev/null 2>&1
|
||||
iverilog -o iverilog-always_full-1 yosys-always_full-1.v always_full_tb.v >/dev/null 2>&1
|
||||
./iverilog-always_full-1 |grep -v '\$finish called' >iverilog-always_full-1.log
|
||||
diff iverilog-always_full.log iverilog-always_full-1.log
|
||||
|
||||
../../yosys -p "read_verilog display_lm.v" >yosys-display_lm.log
|
||||
../../yosys -p "read_verilog display_lm.v; write_cxxrtl yosys-display_lm.cc"
|
||||
../../yosys -p "read_verilog display_lm.v" >yosys-display_lm.log 2>&1
|
||||
../../yosys -p "read_verilog display_lm.v; write_cxxrtl yosys-display_lm.cc" >/dev/null 2>&1
|
||||
${CXX:-g++} -std=c++11 -o yosys-display_lm_cc -I../../backends/cxxrtl/runtime display_lm_tb.cc -lstdc++
|
||||
./yosys-display_lm_cc >yosys-display_lm_cc.log
|
||||
for log in yosys-display_lm.log yosys-display_lm_cc.log; do
|
||||
grep "^%l: \\\\bot\$" "$log"
|
||||
grep "^%m: \\\\bot\$" "$log"
|
||||
grep "^%l: \\\\bot\$" "$log" >/dev/null 2>&1
|
||||
grep "^%m: \\\\bot\$" "$log" >/dev/null 2>&1
|
||||
done
|
||||
|
|
|
|||
2
tests/fsm/.gitignore
vendored
2
tests/fsm/.gitignore
vendored
|
|
@ -1 +1 @@
|
|||
temp
|
||||
uut_*.*
|
||||
|
|
|
|||
|
|
@ -1,21 +1,18 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
import random
|
||||
from contextlib import contextmanager
|
||||
from pathlib import Path
|
||||
|
||||
# set to 'True' to compare verific with yosys
|
||||
test_verific = False
|
||||
|
||||
@contextmanager
|
||||
def redirect_stdout(new_target):
|
||||
old_target, sys.stdout = sys.stdout, new_target
|
||||
try:
|
||||
yield new_target
|
||||
finally:
|
||||
sys.stdout = old_target
|
||||
|
||||
def random_expr(variables):
|
||||
c = random.choice(['bin', 'uni', 'var', 'const'])
|
||||
if c == 'bin':
|
||||
|
|
@ -39,12 +36,16 @@ args = parser.parse_args()
|
|||
seed = args.seed
|
||||
if seed is None:
|
||||
seed = random.randrange(sys.maxsize)
|
||||
print("PRNG seed: %d" % seed)
|
||||
print("fsm PRNG seed: %d" % seed)
|
||||
random.seed(seed)
|
||||
|
||||
for path in Path(".").glob("uut_*.*"):
|
||||
if path.is_file():
|
||||
path.unlink()
|
||||
|
||||
for idx in range(args.count):
|
||||
with open('temp/uut_%05d.v' % idx, 'w') as f:
|
||||
with redirect_stdout(f):
|
||||
with open('uut_%05d.v' % idx, 'w') as f:
|
||||
with gen_tests_makefile.redirect_stdout(f):
|
||||
rst2 = random.choice([False, True])
|
||||
if rst2:
|
||||
print('module uut_%05d(clk, rst1, rst2, rst, a, b, c, x, y, z);' % (idx))
|
||||
|
|
@ -99,16 +100,16 @@ for idx in range(args.count):
|
|||
print(' end')
|
||||
print(' end')
|
||||
print('endmodule')
|
||||
with open('temp/uut_%05d.ys' % idx, 'w') as f:
|
||||
with redirect_stdout(f):
|
||||
with open('uut_%05d.ys' % idx, 'w') as f:
|
||||
with gen_tests_makefile.redirect_stdout(f):
|
||||
if test_verific:
|
||||
print('read_verilog temp/uut_%05d.v' % idx)
|
||||
print('read_verilog uut_%05d.v' % idx)
|
||||
print('proc;; rename uut_%05d gold' % idx)
|
||||
print('verific -vlog2k temp/uut_%05d.v' % idx)
|
||||
print('verific -vlog2k uut_%05d.v' % idx)
|
||||
print('verific -import uut_%05d' % idx)
|
||||
print('rename uut_%05d gate' % idx)
|
||||
else:
|
||||
print('read_verilog temp/uut_%05d.v' % idx)
|
||||
print('read_verilog uut_%05d.v' % idx)
|
||||
print('proc;;')
|
||||
print('copy uut_%05d gold' % idx)
|
||||
print('rename uut_%05d gate' % idx)
|
||||
|
|
@ -118,3 +119,4 @@ for idx in range(args.count):
|
|||
print('miter -equiv -flatten -ignore_gold_x -make_outputs -make_outcmp gold gate miter')
|
||||
print('sat -verify-no-timeout -timeout 20 -seq 5 -set-at 1 %s_rst 1 -prove trigger 0 -prove-skip 1 -show-inputs -show-outputs miter' % ('gold' if rst2 else 'in'))
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
# run this test many times:
|
||||
# time bash -c 'for ((i=0; i<100; i++)); do echo "-- $i --"; bash run-test.sh || exit 1; done'
|
||||
|
||||
set -e
|
||||
|
||||
OPTIND=1
|
||||
count=50
|
||||
seed="" # default to no seed specified
|
||||
while getopts "c:S:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
c) count="$OPTARG" ;;
|
||||
S) seed="-S $OPTARG" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
rm -rf temp
|
||||
mkdir -p temp
|
||||
echo "generating tests.."
|
||||
python3 generate.py -c $count $seed
|
||||
|
||||
{
|
||||
all_targets="all_targets:"
|
||||
echo "all: all_targets"
|
||||
echo " @echo"
|
||||
for i in $( ls temp/*.ys | sed 's,[^0-9],,g; s,^0*\(.\),\1,g;' ); do
|
||||
idx=$( printf "%05d" $i )
|
||||
echo "temp/uut_${idx}.log: temp/uut_${idx}.ys temp/uut_${idx}.v"
|
||||
echo " @echo -n '[$i]'"
|
||||
echo " @../../yosys -ql temp/uut_${idx}.out temp/uut_${idx}.ys"
|
||||
echo " @mv temp/uut_${idx}.out temp/uut_${idx}.log"
|
||||
echo " @grep -q 'SAT proof finished' temp/uut_${idx}.log && echo -n K || echo -n T"
|
||||
all_targets="$all_targets temp/uut_${idx}.log"
|
||||
done
|
||||
echo "$all_targets"
|
||||
} > temp/makefile
|
||||
|
||||
echo "running tests.."
|
||||
${MAKE:-make} -f temp/makefile
|
||||
|
||||
exit 0
|
||||
|
|
@ -1,110 +0,0 @@
|
|||
set -eu
|
||||
|
||||
YOSYS_BASEDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/../ >/dev/null 2>&1 && pwd)"
|
||||
|
||||
# $ generate_target target_name test_command
|
||||
generate_target() {
|
||||
target_name=$(basename $PWD)-$1
|
||||
test_command=$2
|
||||
echo "all: $target_name"
|
||||
echo ".PHONY: $target_name"
|
||||
echo "$target_name:"
|
||||
printf "\t@YOSYS_MAX_THREADS=4 %s\n" "$test_command"
|
||||
printf "\t@echo 'Passed %s'\n" "$target_name"
|
||||
}
|
||||
|
||||
# $ generate_ys_test ys_file [yosys_args]
|
||||
generate_ys_test() {
|
||||
ys_file=$1
|
||||
yosys_args_=${2:-}
|
||||
generate_target "$ys_file" "\"$YOSYS_BASEDIR/yosys\" -ql ${ys_file}.err $yosys_args_ $ys_file && mv ${ys_file}.err ${ys_file}.log"
|
||||
}
|
||||
|
||||
# $ generate_tcl_test tcl_file [yosys_args]
|
||||
generate_tcl_test() {
|
||||
tcl_file=$1
|
||||
yosys_args_=${2:-}
|
||||
generate_target "$tcl_file" "\"$YOSYS_BASEDIR/yosys\" -ql ${tcl_file}.err $yosys_args_ $tcl_file && mv ${tcl_file}.err ${tcl_file}.log"
|
||||
}
|
||||
|
||||
# $ generate_bash_test bash_file
|
||||
generate_bash_test() {
|
||||
bash_file=$1
|
||||
generate_target "$bash_file" "bash -v $bash_file >${bash_file}.err 2>&1 && mv ${bash_file}.err ${bash_file}.log"
|
||||
}
|
||||
|
||||
# $ generate_tests [-y|--yosys-scripts] [-s|--prove-sv] [-b|--bash] [-a|--yosys-args yosys_args]
|
||||
generate_tests() {
|
||||
do_ys=false
|
||||
do_tcl=false
|
||||
do_sv=false
|
||||
do_sh=false
|
||||
yosys_args=""
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
arg="$1"
|
||||
case "$arg" in
|
||||
-y|--yosys-scripts)
|
||||
do_ys=true
|
||||
shift
|
||||
;;
|
||||
-t|--tcl-scripts)
|
||||
do_tcl=true
|
||||
shift
|
||||
;;
|
||||
-s|--prove-sv)
|
||||
do_sv=true
|
||||
shift
|
||||
;;
|
||||
-b|--bash)
|
||||
do_sh=true
|
||||
shift
|
||||
;;
|
||||
-a|--yosys-args)
|
||||
yosys_args+="$2"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
echo >&2 "Unknown argument: $1"
|
||||
exit 1
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ! ( $do_ys = true || $do_tcl = true || $do_sv = true || $do_sh = true ) ]]; then
|
||||
echo >&2 "Error: No file types selected"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ".PHONY: all"
|
||||
echo "all:"
|
||||
|
||||
if [[ $do_ys = true ]]; then
|
||||
for x in *.ys; do
|
||||
generate_ys_test "$x" "$yosys_args"
|
||||
done
|
||||
fi;
|
||||
if [[ $do_tcl = true ]]; then
|
||||
for x in *.tcl; do
|
||||
generate_tcl_test "$x" "$yosys_args"
|
||||
done
|
||||
fi;
|
||||
if [[ $do_sv = true ]]; then
|
||||
for x in *.sv; do
|
||||
if [ ! -f "${x%.sv}.ys" ]; then
|
||||
generate_ys_test "$x" "-p \"prep -top top; async2sync; sat -enable_undef -verify -prove-asserts\" $yosys_args"
|
||||
fi;
|
||||
done
|
||||
fi;
|
||||
if [[ $do_sh == true ]]; then
|
||||
for s in *.sh; do
|
||||
if [ "$s" != "run-test.sh" ]; then
|
||||
generate_bash_test "$s"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
generate_mk() {
|
||||
generate_tests "$@" > run-test.mk
|
||||
}
|
||||
140
tests/gen_tests_makefile.py
Normal file
140
tests/gen_tests_makefile.py
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import glob
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
from contextlib import contextmanager
|
||||
|
||||
yosys_basedir = os.path.relpath(os.path.join(os.path.dirname(__file__), ".."))
|
||||
common_mk = os.path.relpath(os.path.join(os.path.dirname(__file__), "common.mk"))
|
||||
|
||||
def _cwd_base():
|
||||
return os.path.basename(os.getcwd())
|
||||
|
||||
def generate_target(name, command):
|
||||
#target = f"{_cwd_base()}-{name}"
|
||||
target = f"{name}"
|
||||
print(f"all: {target}")
|
||||
print(f".PHONY: {target}")
|
||||
print(f"{target}:")
|
||||
if command:
|
||||
print(f"\t@$(call run_test,{target}, \\")
|
||||
print(f"\t{command})")
|
||||
else:
|
||||
print(f"\t@$(call run_test,{target})")
|
||||
|
||||
def generate_ys_test(ys_file, yosys_args="", commands=""):
|
||||
cmd = f'$(YOSYS) -ql {ys_file}.err {yosys_args} {ys_file} >/dev/null 2>&1 && mv {ys_file}.err {ys_file}.log'
|
||||
if commands:
|
||||
cmd += f"; \\\n{commands}"
|
||||
generate_target(ys_file, cmd)
|
||||
|
||||
def generate_tcl_test(tcl_file, yosys_args="", commands=""):
|
||||
cmd = f'$(YOSYS) -ql {tcl_file}.err {yosys_args} {tcl_file} >/dev/null 2>&1 && mv {tcl_file}.err {tcl_file}.log'
|
||||
if commands:
|
||||
cmd += f"; \\\n{commands}"
|
||||
generate_target(tcl_file, cmd)
|
||||
|
||||
def generate_sv_test(sv_file, yosys_args="", commands=""):
|
||||
base = os.path.splitext(sv_file)[0]
|
||||
if not os.path.exists(base + ".ys"):
|
||||
yosys_cmd = '-p "prep -top top; async2sync; sat -enable_undef -verify -prove-asserts"'
|
||||
cmd = f'$(YOSYS) -ql {sv_file}.err {yosys_cmd} {yosys_args} {sv_file} >/dev/null 2>&1 && mv {sv_file}.err {sv_file}.log'
|
||||
if commands:
|
||||
cmd += f"; \\\n{commands}"
|
||||
generate_target(sv_file, cmd)
|
||||
|
||||
def generate_bash_test(sh_file, commands=""):
|
||||
cmd = f"bash -v {sh_file} >{sh_file}.err 2>&1 && mv {sh_file}.err {sh_file}.log"
|
||||
if commands:
|
||||
cmd += f"; \\\n{commands}"
|
||||
generate_target(sh_file, cmd)
|
||||
|
||||
def unpack_cmd(cmd):
|
||||
if isinstance(cmd, str):
|
||||
return cmd
|
||||
if isinstance(cmd, (list, tuple)):
|
||||
return " \\\n".join(cmd)
|
||||
raise TypeError("cmd must be a string or a list/tuple of strings")
|
||||
|
||||
def generate_cmd_test(test_name, cmd, yosys_args=""):
|
||||
generate_target(test_name, unpack_cmd(cmd))
|
||||
|
||||
def generate_tests(argv, cmds):
|
||||
parser = argparse.ArgumentParser(add_help=False)
|
||||
parser.add_argument("-y", "--yosys-scripts", action="store_true")
|
||||
parser.add_argument("-t", "--tcl-scripts", action="store_true")
|
||||
parser.add_argument("-s", "--prove-sv", action="store_true")
|
||||
parser.add_argument("-b", "--bash", action="store_true")
|
||||
parser.add_argument("-a", "--yosys-args", default="")
|
||||
|
||||
args = parser.parse_args(argv)
|
||||
|
||||
if not (args.yosys_scripts or args.tcl_scripts or args.prove_sv or args.bash):
|
||||
raise RuntimeError("No file types selected")
|
||||
|
||||
if args.yosys_scripts:
|
||||
for f in sorted(glob.glob("*.ys")):
|
||||
generate_ys_test(f, args.yosys_args, cmds)
|
||||
|
||||
if args.tcl_scripts:
|
||||
for f in sorted(glob.glob("*.tcl")):
|
||||
generate_tcl_test(f, args.yosys_args, cmds)
|
||||
|
||||
if args.prove_sv:
|
||||
for f in sorted(glob.glob("*.sv")):
|
||||
generate_sv_test(f, args.yosys_args, cmds)
|
||||
|
||||
if args.bash:
|
||||
for f in sorted(glob.glob("*.sh")):
|
||||
if f != "run-test.sh":
|
||||
generate_bash_test(f, cmds)
|
||||
|
||||
def print_header(extra=None):
|
||||
print(f"include {common_mk}")
|
||||
print(f"YOSYS ?= {yosys_basedir}/yosys")
|
||||
print("")
|
||||
print("export YOSYS_MAX_THREADS := 4")
|
||||
if extra:
|
||||
for line in extra:
|
||||
print(line)
|
||||
print("")
|
||||
print(".PHONY: all")
|
||||
print("all:")
|
||||
|
||||
@contextmanager
|
||||
def redirect_stdout(new_target):
|
||||
old_target, sys.stdout = sys.stdout, new_target
|
||||
try:
|
||||
yield new_target
|
||||
finally:
|
||||
sys.stdout = old_target
|
||||
|
||||
def generate(argv, extra=None, cmds=""):
|
||||
with open("Makefile", "w") as f:
|
||||
with redirect_stdout(f):
|
||||
print_header(extra)
|
||||
generate_tests(argv, cmds)
|
||||
|
||||
def generate_custom(callback, extra=None):
|
||||
with open("Makefile", "w") as f:
|
||||
with redirect_stdout(f):
|
||||
print_header(extra)
|
||||
callback()
|
||||
|
||||
def generate_autotest_file(test_file, commands):
|
||||
cmd = f"../tools/autotest.sh -G -j ${{SEEDOPT}} ${{EXTRA_FLAGS}} {test_file} >/dev/null 2>&1; \\\n{commands}"
|
||||
generate_target(test_file, cmd)
|
||||
|
||||
def generate_autotest(pattern, extra_flags, cmds=""):
|
||||
with open("Makefile", "w") as f:
|
||||
with redirect_stdout(f):
|
||||
print_header([ f"EXTRA_FLAGS = {extra_flags}",
|
||||
"SEED ?=",
|
||||
"ifneq ($(strip $(SEED)),)",
|
||||
" SEEDOPT=-S$(SEED)",
|
||||
"endif",
|
||||
])
|
||||
for fn in sorted(glob.glob(pattern)):
|
||||
generate_autotest_file(fn, cmds)
|
||||
8
tests/hana/generate_mk.py
Normal file
8
tests/hana/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate_autotest("test_*.v", "-l hana_vlib.v -n 300 -e")
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
OPTIND=1
|
||||
seed="" # default to no seed specified
|
||||
while getopts "S:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
S) arg="${OPTARG#"${OPTARG%%[![:space:]]*}"}" # remove leading space
|
||||
seed="SEED=$arg" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
exec ${MAKE:-make} -f ../tools/autotest.mk $seed EXTRA_FLAGS="-l hana_vlib.v -n 300 -e" test_*.v
|
||||
|
|
@ -10,13 +10,13 @@ for x in *.lib; do
|
|||
diff $x.filtered $x.filtered.ok
|
||||
diff $x.verilogsim $x.verilogsim.ok
|
||||
if [[ -e ${x%.lib}.log.ok ]]; then
|
||||
../../yosys -p "dfflibmap -info -liberty ${x}" -TqqQl ${x%.lib}.log
|
||||
../../yosys -p "dfflibmap -info -liberty ${x}" -TqqQl ${x%.lib}.log >/dev/null 2>&1
|
||||
diff ${x%.lib}.log ${x%.lib}.log.ok
|
||||
fi
|
||||
done
|
||||
|
||||
for x in *.ys; do
|
||||
echo "Running $x.."
|
||||
../../yosys -q -s $x -l ${x%.ys}.log
|
||||
../../yosys -q -s $x -l ${x%.ys}.log >/dev/null 2>&1
|
||||
done
|
||||
|
||||
|
|
|
|||
69
tests/memfile/generate_mk.py
Normal file
69
tests/memfile/generate_mk.py
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
def create_tests():
|
||||
setup = "mkdir -p temp && cp content1.dat temp/content2.dat"
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("parent_content1", [
|
||||
f"{setup};",
|
||||
'(cd .. && $(YOSYS_ABS) -qp "read_verilog -defer memfile/memory.v;',
|
||||
'chparam -set MEMFILE \\"content1.dat\\" memory") >/dev/null 2>&1',
|
||||
])
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("parent_content2_temp", [
|
||||
f"{setup};",
|
||||
'(cd .. && $(YOSYS_ABS) -qp "read_verilog -defer memfile/memory.v;',
|
||||
'chparam -set MEMFILE \\"temp/content2.dat\\" memory") >/dev/null 2>&1',
|
||||
])
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("parent_content2_full", [
|
||||
f"{setup};",
|
||||
'(cd .. && $(YOSYS_ABS) -qp "read_verilog -defer memfile/memory.v;',
|
||||
'chparam -set MEMFILE \\"memfile/temp/content2.dat\\" memory") >/dev/null 2>&1',
|
||||
])
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("same_content1", [
|
||||
f"{setup};",
|
||||
'$(YOSYS) -qp "read_verilog -defer memory.v;',
|
||||
'chparam -set MEMFILE \\"content1.dat\\" memory" >/dev/null 2>&1',
|
||||
])
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("same_content2", [
|
||||
f"{setup};",
|
||||
'$(YOSYS) -qp "read_verilog -defer memory.v;',
|
||||
'chparam -set MEMFILE \\"temp/content2.dat\\" memory" >/dev/null 2>&1',
|
||||
])
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("child_content1", [
|
||||
f"{setup};",
|
||||
'(cd temp && ../$(YOSYS) -qp "read_verilog -defer ../memory.v;',
|
||||
'chparam -set MEMFILE \\"content1.dat\\" memory") >/dev/null 2>&1',
|
||||
])
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("child_content2_temp", [
|
||||
f"{setup};",
|
||||
'(cd temp && ../$(YOSYS) -qp "read_verilog -defer ../memory.v;',
|
||||
'chparam -set MEMFILE \\"temp/content2.dat\\" memory") >/dev/null 2>&1',
|
||||
])
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("child_content2_direct", [
|
||||
f"{setup};",
|
||||
'(cd temp && ../$(YOSYS) -qp "read_verilog -defer ../memory.v;',
|
||||
'chparam -set MEMFILE \\"temp/content2.dat\\" memory") >/dev/null 2>&1',
|
||||
])
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("fail_empty_filename",
|
||||
'! $(YOSYS) -qp "read_verilog memory.v" >/dev/null 2>&1')
|
||||
|
||||
gen_tests_makefile.generate_cmd_test("fail_missing_file", [
|
||||
'! $(YOSYS) -qp "read_verilog -defer memory.v;',
|
||||
'chparam -set MEMFILE \\"content3.dat\\" memory" >/dev/null 2>&1',
|
||||
])
|
||||
|
||||
extra = ["YOSYS_ABS := $(abspath $(YOSYS))"]
|
||||
gen_tests_makefile.generate_custom(create_tests, extra)
|
||||
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
set -e
|
||||
|
||||
mkdir -p temp
|
||||
cp content1.dat temp/content2.dat
|
||||
|
||||
cd ..
|
||||
|
||||
echo "Running from the parent directory with content1.dat"
|
||||
../yosys -qp "read_verilog -defer memfile/memory.v; chparam -set MEMFILE \"content1.dat\" memory"
|
||||
echo "Running from the parent directory with temp/content2.dat"
|
||||
../yosys -qp "read_verilog -defer memfile/memory.v; chparam -set MEMFILE \"temp/content2.dat\" memory"
|
||||
echo "Running from the parent directory with memfile/temp/content2.dat"
|
||||
../yosys -qp "read_verilog -defer memfile/memory.v; chparam -set MEMFILE \"memfile/temp/content2.dat\" memory"
|
||||
|
||||
cd memfile
|
||||
|
||||
echo "Running from the same directory with content1.dat"
|
||||
../../yosys -qp "read_verilog -defer memory.v; chparam -set MEMFILE \"content1.dat\" memory"
|
||||
echo "Running from the same directory with temp/content2.dat"
|
||||
../../yosys -qp "read_verilog -defer memory.v; chparam -set MEMFILE \"temp/content2.dat\" memory"
|
||||
|
||||
cd temp
|
||||
|
||||
echo "Running from a child directory with content1.dat"
|
||||
../../../yosys -qp "read_verilog -defer ../memory.v; chparam -set MEMFILE \"content1.dat\" memory"
|
||||
echo "Running from a child directory with temp/content2.dat"
|
||||
../../../yosys -qp "read_verilog -defer ../memory.v; chparam -set MEMFILE \"temp/content2.dat\" memory"
|
||||
echo "Running from a child directory with content2.dat"
|
||||
../../../yosys -qp "read_verilog -defer ../memory.v; chparam -set MEMFILE \"temp/content2.dat\" memory"
|
||||
|
||||
cd ..
|
||||
|
||||
echo "Checking a failure when zero length filename is provided"
|
||||
if ../../yosys -qp "read_verilog memory.v"; then
|
||||
echo "The execution should fail but it didn't happen, which is WRONG."
|
||||
exit 1
|
||||
else
|
||||
echo "Execution failed, which is OK."
|
||||
fi
|
||||
|
||||
echo "Checking a failure when not existing filename is provided"
|
||||
if ../../yosys -qp "read_verilog -defer memory.v; chparam -set MEMFILE \"content3.dat\" memory"; then
|
||||
echo "The execution should fail but it didn't happen, which is WRONG."
|
||||
exit 1
|
||||
else
|
||||
echo "Execution failed, which is OK."
|
||||
fi
|
||||
|
|
@ -1,3 +1,9 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
import gen_tests_makefile
|
||||
|
||||
# TODO:
|
||||
|
||||
# - priority logic
|
||||
|
|
@ -319,8 +325,8 @@ if (OFFSET > 0) begin
|
|||
|
||||
always @(mem_read, subaddr_r)
|
||||
rd <= mem_read[subaddr_r*RDBITS+:RDBITS];
|
||||
end
|
||||
else
|
||||
end
|
||||
else
|
||||
begin
|
||||
always @(posedge clk)
|
||||
case (OFFSET)
|
||||
|
|
@ -970,7 +976,7 @@ for (abits, wbits, words, defs, cells) in [
|
|||
name, ENABLES.format(abits=abits, wbits=wbits, words=words),
|
||||
["wren"], defs, cells
|
||||
))
|
||||
|
||||
|
||||
# abits/dbits determination (aka general geometry picking)
|
||||
GEOMETRIC = """
|
||||
module top(clk, rwa, rd, wd, we);
|
||||
|
|
@ -991,7 +997,7 @@ always @(posedge clk)
|
|||
if (we)
|
||||
mem[rwa] <= wd;
|
||||
else
|
||||
rd <= mem[rwa];
|
||||
rd <= mem[rwa];
|
||||
|
||||
endmodule
|
||||
"""
|
||||
|
|
@ -1372,7 +1378,7 @@ for (abits, wbits, rwords, cntquad, cntoct) in [
|
|||
(4, 2, 4, 1, 1),
|
||||
(4, 2, 5, 2, 1),
|
||||
(4, 2, 6, 2, 1),
|
||||
(4, 2, 7, 2, 1), # Write port needs to be duplicated, so only 3 extra read
|
||||
(4, 2, 7, 2, 1), # Write port needs to be duplicated, so only 3 extra read
|
||||
(4, 2, 8, 3, 1), # ports per quad port LUT (i.e. 7 ports in 2, 8 ports in 3)
|
||||
(4, 2, 9, 3, 2),
|
||||
(4, 4, 1, 2, 2),
|
||||
|
|
@ -1440,7 +1446,7 @@ for (testname, reset_gate, rdwr, clk_en, add_logic) in [
|
|||
write = "if (wren) \n\t\tmem[addr] <= wdata;"
|
||||
|
||||
if rdwr == "new":
|
||||
read = """if (rden)
|
||||
read = """if (rden)
|
||||
if (wren)
|
||||
rdata <= wdata;
|
||||
else
|
||||
|
|
@ -1466,7 +1472,7 @@ end"""
|
|||
|
||||
TESTS.append(Test(
|
||||
testname, PRIORITY.format(code=code, abits=4, wbits=8, words=2),
|
||||
["block_sp_full"], ["USE_SRST"],
|
||||
["block_sp_full"], ["USE_SRST"],
|
||||
{"RAM_BLOCK_SP": 1, "$*": add_logic}
|
||||
))
|
||||
|
||||
|
|
@ -1510,10 +1516,10 @@ end"""
|
|||
|
||||
TESTS.append(Test(
|
||||
testname, PRIORITY.format(code=code, abits=4, wbits=1, words=2),
|
||||
["block_sp_full"], defs,
|
||||
["block_sp_full"], defs,
|
||||
{"RAM_BLOCK_SP": 1, "$*": add_logic}
|
||||
))
|
||||
|
||||
|
||||
ROM_CASE = """
|
||||
module rom(input clk, input [2:0] addr, {attr}output reg [7:0] data);
|
||||
|
||||
|
|
@ -1536,44 +1542,50 @@ endmodule
|
|||
TESTS.append(Test("rom_case", ROM_CASE.format(attr=""), ["block_sdp"], [], {"RAM_BLOCK_SDP" : 0}))
|
||||
TESTS.append(Test("rom_case_block", ROM_CASE.format(attr="(* rom_style = \"block\" *) "), ["block_sdp"], [], {"RAM_BLOCK_SDP" : 1}))
|
||||
|
||||
with open("run-test.mk", "w") as mf:
|
||||
mf.write("ifneq ($(strip $(SEED)),)\n")
|
||||
mf.write("SEEDOPT=-S$(SEED)\n")
|
||||
mf.write("endif\n")
|
||||
mf.write("all:")
|
||||
for t in TESTS:
|
||||
mf.write(" " + t.name)
|
||||
mf.write("\n")
|
||||
mf.write(".PHONY: all\n")
|
||||
|
||||
|
||||
for t in TESTS:
|
||||
with open("t_{}.v".format(t.name), "w") as tf:
|
||||
tf.write(t.src)
|
||||
with open("t_{}.ys".format(t.name), "w") as sf:
|
||||
sf.write("proc\n")
|
||||
sf.write("opt\n")
|
||||
sf.write("opt -full\n")
|
||||
sf.write("memory -nomap\n")
|
||||
sf.write("dump\n")
|
||||
sf.write("memory_libmap")
|
||||
for lib in t.libs:
|
||||
sf.write(" -lib ../memlib_{}.txt".format(lib))
|
||||
for d in t.defs:
|
||||
sf.write(" -D {}".format(d))
|
||||
sf.write("\n")
|
||||
sf.write("memory_map\n")
|
||||
for k, v in t.cells.items():
|
||||
if isinstance(v, tuple):
|
||||
(cc, ca) = v
|
||||
sf.write("select -assert-count {} t:{}\n".format(cc, k))
|
||||
for kk, vv in ca.items():
|
||||
sf.write("select -assert-count {} t:{} r:{}={} %i\n".format(cc, k, kk, vv))
|
||||
else:
|
||||
sf.write("select -assert-count {} t:{}\n".format(v, k))
|
||||
mf.write("{}:\n".format(t.name))
|
||||
mf.write("\t@../tools/autotest.sh -G -j $(SEEDOPT) $(EXTRA_FLAGS) -p 'script ../t_{}.ys'".format(t.name))
|
||||
for t in TESTS:
|
||||
with open("t_{}.v".format(t.name), "w") as tf:
|
||||
tf.write(t.src)
|
||||
with open("t_{}.ys".format(t.name), "w") as sf:
|
||||
sf.write("proc\n")
|
||||
sf.write("opt\n")
|
||||
sf.write("opt -full\n")
|
||||
sf.write("memory -nomap\n")
|
||||
sf.write("dump\n")
|
||||
sf.write("memory_libmap")
|
||||
for lib in t.libs:
|
||||
mf.write(" -l memlib_{}.v".format(lib))
|
||||
mf.write(" t_{}.v || (cat t_{}.err; exit 1)\n".format(t.name, t.name))
|
||||
mf.write(".PHONY: {}\n".format(t.name))
|
||||
sf.write(" -lib ../memlib_{}.txt".format(lib))
|
||||
for d in t.defs:
|
||||
sf.write(" -D {}".format(d))
|
||||
sf.write("\n")
|
||||
sf.write("memory_map\n")
|
||||
for k, v in t.cells.items():
|
||||
if isinstance(v, tuple):
|
||||
(cc, ca) = v
|
||||
sf.write("select -assert-count {} t:{}\n".format(cc, k))
|
||||
for kk, vv in ca.items():
|
||||
sf.write("select -assert-count {} t:{} r:{}={} %i\n".format(cc, k, kk, vv))
|
||||
else:
|
||||
sf.write("select -assert-count {} t:{}\n".format(v, k))
|
||||
|
||||
def create_tests():
|
||||
for t in TESTS:
|
||||
libs_args = ""
|
||||
for lib in t.libs:
|
||||
libs_args += f" -l memlib_{lib}.v"
|
||||
cmd = (
|
||||
f"../tools/autotest.sh -G -j ${{SEEDOPT}} ${{EXTRA_FLAGS}} "
|
||||
f"-p 'script ../t_{t.name}.ys'"
|
||||
f"{libs_args} "
|
||||
f"t_{t.name}.v >/dev/null 2>&1 || (cat t_{t.name}.err; exit 1)"
|
||||
)
|
||||
gen_tests_makefile.generate_target(t.name, cmd)
|
||||
|
||||
extra = [
|
||||
"SEED ?=",
|
||||
"ifneq ($(strip $(SEED)),)",
|
||||
" SEEDOPT=-S$(SEED)",
|
||||
"endif",
|
||||
]
|
||||
gen_tests_makefile.generate_custom(create_tests, extra)
|
||||
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
set -eu
|
||||
|
||||
OPTIND=1
|
||||
seed="" # default to no seed specified
|
||||
while getopts "S:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
S) seed="$OPTARG" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
python3 generate.py
|
||||
exec ${MAKE:-make} -f run-test.mk SEED="$seed"
|
||||
58
tests/memories/generate_mk.py
Normal file
58
tests/memories/generate_mk.py
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate_autotest("*.v", "",
|
||||
"""if grep -Eq 'expect-(wr-ports|rd-ports|rd-clk)' $@; then \\
|
||||
$(YOSYS) -f verilog -qp "proc; opt; memory -nomap; dump -outfile $(@:.v=).dmp t:\\$$mem_v2" $@; \\
|
||||
if grep -q expect-wr-ports $@; then \\
|
||||
val=$$(gawk '/expect-wr-ports/ { print $$3; }' $@); \\
|
||||
grep -Fq "parameter \\\\WR_PORTS $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected number of write ports."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-wr-wide-continuation $@; then \\
|
||||
val=$$(gawk '/expect-wr-wide-continuation/ { print $$3; }' $@); \\
|
||||
grep -Fq "parameter \\\\WR_WIDE_CONTINUATION $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected write wide continuation."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-rd-ports $@; then \\
|
||||
val=$$(gawk '/expect-rd-ports/ { print $$3; }' $@); \\
|
||||
grep -Fq "parameter \\\\RD_PORTS $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected number of read ports."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-rd-clk $@; then \\
|
||||
val=$$(gawk '/expect-rd-clk/ { print $$3; }' $@); \\
|
||||
grep -Fq "connect \\\\RD_CLK $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected read clock."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-rd-en $@; then \\
|
||||
val=$$(gawk '/expect-rd-en/ { print $$3; }' $@); \\
|
||||
grep -Fq "connect \\\\RD_EN $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected read enable."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-rd-srst-sig $@; then \\
|
||||
val=$$(gawk '/expect-rd-srst-sig/ { print $$3; }' $@); \\
|
||||
grep -Fq "connect \\\\RD_SRST $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected read sync reset."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-rd-srst-val $@; then \\
|
||||
val=$$(gawk '/expect-rd-srst-val/ { print $$3; }' $@); \\
|
||||
grep -Fq "parameter \\\\RD_SRST_VALUE $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected read sync reset value."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-rd-arst-sig $@; then \\
|
||||
val=$$(gawk '/expect-rd-arst-sig/ { print $$3; }' $@); \\
|
||||
grep -Fq "connect \\\\RD_ARST $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected read async reset."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-rd-arst-val $@; then \\
|
||||
val=$$(gawk '/expect-rd-arst-val/ { print $$3; }' $@); \\
|
||||
grep -Fq "parameter \\\\RD_ARST_VALUE $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected read async reset value."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-rd-init-val $@; then \\
|
||||
val=$$(gawk '/expect-rd-init-val/ { print $$3; }' $@); \\
|
||||
grep -Fq "parameter \\\\RD_INIT_VALUE $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected read init value."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-rd-wide-continuation $@; then \\
|
||||
val=$$(gawk '/expect-rd-wide-continuation/ { print $$3; }' $@); \\
|
||||
grep -Fq "parameter \\\\RD_WIDE_CONTINUATION $$val" $(@:.v=).dmp || { echo " ERROR: Unexpected read wide continuation."; exit 1; }; \\
|
||||
fi; \\
|
||||
if grep -q expect-no-rd-clk $@; then \\
|
||||
grep -Fq "connect \\\\RD_CLK 1'x" $(@:.v=).dmp || { echo " ERROR: Expected no read clock."; exit 1; }; \\
|
||||
fi; \\
|
||||
fi""")
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
set -e
|
||||
|
||||
OPTIND=1
|
||||
seed="" # default to no seed specified
|
||||
abcopt=""
|
||||
while getopts "A:S:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
A) abcopt="-A $OPTARG" ;;
|
||||
S) seed="$OPTARG" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
${MAKE:-make} -f ../tools/autotest.mk SEED="$seed" EXTRA_FLAGS="$abcopt" *.v
|
||||
|
||||
for f in `egrep -l 'expect-(wr-ports|rd-ports|rd-clk)' *.v`; do
|
||||
echo -n "Testing expectations for $f .."
|
||||
../../yosys -f verilog -qp "proc; opt; memory -nomap;; dump -outfile ${f%.v}.dmp t:\$mem_v2" $f
|
||||
if grep -q expect-wr-ports $f; then
|
||||
grep -q "parameter \\\\WR_PORTS $(gawk '/expect-wr-ports/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected number of write ports."; false; }
|
||||
fi
|
||||
if grep -q expect-wr-wide-continuation $f; then
|
||||
grep -q "parameter \\\\WR_WIDE_CONTINUATION $(gawk '/expect-wr-wide-continuation/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected write wide continuation."; false; }
|
||||
fi
|
||||
if grep -q expect-rd-ports $f; then
|
||||
grep -q "parameter \\\\RD_PORTS $(gawk '/expect-rd-ports/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected number of read ports."; false; }
|
||||
fi
|
||||
if grep -q expect-rd-clk $f; then
|
||||
grep -q "connect \\\\RD_CLK \\$(gawk '/expect-rd-clk/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected read clock."; false; }
|
||||
fi
|
||||
if grep -q expect-rd-en $f; then
|
||||
grep -q "connect \\\\RD_EN \\$(gawk '/expect-rd-en/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected read enable."; false; }
|
||||
fi
|
||||
if grep -q expect-rd-srst-sig $f; then
|
||||
grep -q "connect \\\\RD_SRST \\$(gawk '/expect-rd-srst-sig/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected read sync reset."; false; }
|
||||
fi
|
||||
if grep -q expect-rd-srst-val $f; then
|
||||
grep -q "parameter \\\\RD_SRST_VALUE $(gawk '/expect-rd-srst-val/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected read sync reset value."; false; }
|
||||
fi
|
||||
if grep -q expect-rd-arst-sig $f; then
|
||||
grep -q "connect \\\\RD_ARST \\$(gawk '/expect-rd-arst-sig/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected read async reset."; false; }
|
||||
fi
|
||||
if grep -q expect-rd-arst-val $f; then
|
||||
grep -q "parameter \\\\RD_ARST_VALUE $(gawk '/expect-rd-arst-val/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected read async reset value."; false; }
|
||||
fi
|
||||
if grep -q expect-rd-init-val $f; then
|
||||
grep -q "parameter \\\\RD_INIT_VALUE $(gawk '/expect-rd-init-val/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected read init value."; false; }
|
||||
fi
|
||||
if grep -q expect-rd-wide-continuation $f; then
|
||||
grep -q "parameter \\\\RD_WIDE_CONTINUATION $(gawk '/expect-rd-wide-continuation/ { print $3; }' $f)\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Unexpected read wide continuation."; false; }
|
||||
fi
|
||||
if grep -q expect-no-rd-clk $f; then
|
||||
grep -q "connect \\\\RD_CLK 1'x\$" ${f%.v}.dmp ||
|
||||
{ echo " ERROR: Expected no read clock."; false; }
|
||||
fi
|
||||
echo " ok."
|
||||
done
|
||||
|
||||
8
tests/opt/generate_mk.py
Normal file
8
tests/opt/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--tcl-scripts"])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --tcl-scripts
|
||||
2
tests/opt_share/.gitignore
vendored
2
tests/opt_share/.gitignore
vendored
|
|
@ -1 +1 @@
|
|||
temp
|
||||
uut_*.*
|
||||
|
|
|
|||
|
|
@ -1,48 +1,42 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
import random
|
||||
from contextlib import contextmanager
|
||||
|
||||
|
||||
@contextmanager
|
||||
def redirect_stdout(new_target):
|
||||
old_target, sys.stdout = sys.stdout, new_target
|
||||
try:
|
||||
yield new_target
|
||||
finally:
|
||||
sys.stdout = old_target
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
def random_plus_x():
|
||||
return "%s x" % random.choice(['+', '+', '+', '-', '-', '|', '&', '^'])
|
||||
|
||||
|
||||
def maybe_plus_x(expr):
|
||||
if random.randint(0, 4) == 0:
|
||||
return "(%s %s)" % (expr, random_plus_x())
|
||||
else:
|
||||
return expr
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
parser.add_argument('-S', '--seed', type=int, help='seed for PRNG')
|
||||
parser.add_argument('-c',
|
||||
'--count',
|
||||
type=int,
|
||||
default=100,
|
||||
help='number of test cases to generate')
|
||||
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
parser.add_argument('-S', '--seed', type = int, help = 'seed for PRNG')
|
||||
parser.add_argument('-c', '--count', type = int, default = 100, help = 'number of test cases to generate')
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.seed is not None:
|
||||
print("PRNG seed: %d" % args.seed)
|
||||
random.seed(args.seed)
|
||||
seed = args.seed
|
||||
if seed is None:
|
||||
seed = random.randrange(sys.maxsize)
|
||||
print("opt_share PRNG seed: %d" % seed)
|
||||
random.seed(seed)
|
||||
|
||||
for path in Path(".").glob("uut_*.*"):
|
||||
if path.is_file():
|
||||
path.unlink()
|
||||
|
||||
for idx in range(args.count):
|
||||
with open('temp/uut_%05d.v' % idx, 'w') as f:
|
||||
with redirect_stdout(f):
|
||||
with open('uut_%05d.v' % idx, 'w') as f:
|
||||
with gen_tests_makefile.redirect_stdout(f):
|
||||
print('module uut_%05d(a, b, c, s, y);' % (idx))
|
||||
op = random.choice([
|
||||
random.choice(['+', '-', '*', '/', '%']),
|
||||
|
|
@ -67,20 +61,20 @@ for idx in range(args.count):
|
|||
cast2, ops2[0], op, ops2[1]))
|
||||
print('endmodule')
|
||||
|
||||
with open('temp/uut_%05d.ys' % idx, 'w') as f:
|
||||
with redirect_stdout(f):
|
||||
print('read_verilog temp/uut_%05d.v' % idx)
|
||||
with open('uut_%05d.ys' % idx, 'w') as f:
|
||||
with gen_tests_makefile.redirect_stdout(f):
|
||||
print('read_verilog uut_%05d.v' % idx)
|
||||
print('proc;;')
|
||||
print('copy uut_%05d gold' % idx)
|
||||
print('rename uut_%05d gate' % idx)
|
||||
print('tee -a temp/all_share_log.txt log')
|
||||
print('tee -a temp/all_share_log.txt log #job# uut_%05d' % idx)
|
||||
print('tee -a temp/all_share_log.txt opt gate')
|
||||
print('tee -a temp/all_share_log.txt opt_share gate')
|
||||
print('tee -a temp/all_share_log.txt opt_clean gate')
|
||||
print('tee -o uut_%05d.txt opt gate' % idx)
|
||||
print('tee -o uut_%05d.txt opt_share gate' % idx)
|
||||
print('tee -o uut_%05d.txt opt_clean gate' % idx)
|
||||
print(
|
||||
'miter -equiv -flatten -ignore_gold_x -make_outputs -make_outcmp gold gate miter'
|
||||
)
|
||||
print(
|
||||
'sat -set-def-inputs -verify -prove trigger 0 -show-inputs -show-outputs miter'
|
||||
)
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
# run this test many times:
|
||||
# time bash -c 'for ((i=0; i<100; i++)); do echo "-- $i --"; bash run-test.sh || exit 1; done'
|
||||
|
||||
set -e
|
||||
|
||||
OPTIND=1
|
||||
count=100
|
||||
seed="" # default to no seed specified
|
||||
while getopts "c:S:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
c) count="$OPTARG" ;;
|
||||
S) seed="-S $OPTARG" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
rm -rf temp
|
||||
mkdir -p temp
|
||||
echo "generating tests.."
|
||||
python3 generate.py -c $count $seed
|
||||
|
||||
{
|
||||
echo ".PHONY: all"
|
||||
echo "all:"
|
||||
|
||||
for i in $( ls temp/*.ys | sed 's,[^0-9],,g; s,^0*\(.\),\1,g;' ); do
|
||||
idx=$( printf "%05d" $i )
|
||||
echo ".PHONY: test-$idx"
|
||||
echo "all: test-$idx"
|
||||
echo "test-$idx:"
|
||||
printf "\t@%s\n" \
|
||||
"echo -n [$i]" \
|
||||
"../../yosys -ql temp/uut_${idx}.log temp/uut_${idx}.ys"
|
||||
done
|
||||
} > temp/makefile
|
||||
|
||||
echo "running tests.."
|
||||
${MAKE:-make} -f temp/makefile
|
||||
echo
|
||||
|
||||
failed_share=$( echo $( gawk '/^#job#/ { j=$2; db[j]=0; } /^Removing [246] cells/ { delete db[j]; } END { for (j in db) print(j); }' temp/all_share_log.txt ) )
|
||||
if [ -n "$failed_share" ]; then
|
||||
echo "Resource sharing failed for the following test cases: $failed_share"
|
||||
false
|
||||
fi
|
||||
|
||||
exit 0
|
||||
8
tests/peepopt/generate_mk.py
Normal file
8
tests/peepopt/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
set -e
|
||||
for x in *.ys; do
|
||||
echo "Running $x.."
|
||||
../../yosys -ql ${x%.ys}.log $x
|
||||
done
|
||||
8
tests/proc/generate_mk.py
Normal file
8
tests/proc/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
set -e
|
||||
for x in *.ys; do
|
||||
echo "Running $x.."
|
||||
../../yosys -ql ${x%.ys}.log $x
|
||||
done
|
||||
|
|
@ -23,8 +23,8 @@ echo "running tests.."
|
|||
for ((i = 0; i < $count; i++)); do
|
||||
echo -n "[$i]"
|
||||
idx=$( printf "%05d" $i )
|
||||
../../../yosys -qq uut_${idx}.ys
|
||||
iverilog -o uut_${idx}_tb uut_${idx}_tb.v uut_${idx}.v uut_${idx}_syn.v
|
||||
../../../yosys -qq uut_${idx}.ys >/dev/null 2>&1
|
||||
iverilog -o uut_${idx}_tb uut_${idx}_tb.v uut_${idx}.v uut_${idx}_syn.v >/dev/null 2>&1
|
||||
./uut_${idx}_tb | tee uut_${idx}.err
|
||||
if test -s uut_${idx}.err; then
|
||||
echo "Note: Make sure that 'iverilog' is an up-to-date git checkout of Icarus Verilog."
|
||||
|
|
|
|||
8
tests/rpc/generate_mk.py
Normal file
8
tests/rpc/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
8
tests/rtlil/generate_mk.py
Normal file
8
tests/rtlil/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash"])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../gen-tests-makefile.sh
|
||||
generate_mk --bash --yosys-scripts
|
||||
8
tests/sat/generate_mk.py
Normal file
8
tests/sat/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts
|
||||
8
tests/sdc/generate_mk.py
Normal file
8
tests/sdc/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash"])
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../gen-tests-makefile.sh
|
||||
generate_mk --yosys-scripts --bash
|
||||
8
tests/select/generate_mk.py
Normal file
8
tests/select/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
set -e
|
||||
for x in *.ys; do
|
||||
echo "Running $x.."
|
||||
../../yosys -ql ${x%.ys}.log $x
|
||||
done
|
||||
2
tests/share/.gitignore
vendored
2
tests/share/.gitignore
vendored
|
|
@ -1 +1 @@
|
|||
temp
|
||||
uut_*.*
|
||||
|
|
|
|||
|
|
@ -1,17 +1,14 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
import random
|
||||
from contextlib import contextmanager
|
||||
|
||||
@contextmanager
|
||||
def redirect_stdout(new_target):
|
||||
old_target, sys.stdout = sys.stdout, new_target
|
||||
try:
|
||||
yield new_target
|
||||
finally:
|
||||
sys.stdout = old_target
|
||||
from pathlib import Path
|
||||
|
||||
def random_plus_x():
|
||||
return "%s x" % random.choice(['+', '+', '+', '-', '-', '|', '&', '^'])
|
||||
|
|
@ -27,13 +24,19 @@ parser.add_argument('-S', '--seed', type = int, help = 'seed for PRNG')
|
|||
parser.add_argument('-c', '--count', type = int, default = 100, help = 'number of test cases to generate')
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.seed is not None:
|
||||
print("PRNG seed: %d" % args.seed)
|
||||
random.seed(args.seed)
|
||||
seed = args.seed
|
||||
if seed is None:
|
||||
seed = random.randrange(sys.maxsize)
|
||||
print("share PRNG seed: %d" % seed)
|
||||
random.seed(seed)
|
||||
|
||||
for path in Path(".").glob("uut_*.*"):
|
||||
if path.is_file():
|
||||
path.unlink()
|
||||
|
||||
for idx in range(args.count):
|
||||
with open('temp/uut_%05d.v' % idx, 'w') as f:
|
||||
with redirect_stdout(f):
|
||||
with open('uut_%05d.v' % idx, 'w') as f:
|
||||
with gen_tests_makefile.redirect_stdout(f):
|
||||
if random.choice(['bin', 'uni']) == 'bin':
|
||||
print('module uut_%05d(a, b, c, d, x, s, y);' % (idx))
|
||||
op = random.choice([
|
||||
|
|
@ -67,16 +70,16 @@ for idx in range(args.count):
|
|||
random.choice(['', '$signed', '$unsigned']), op, maybe_plus_x('b'),
|
||||
random_plus_x() if random.randint(0, 4) == 0 else ''))
|
||||
print('endmodule')
|
||||
with open('temp/uut_%05d.ys' % idx, 'w') as f:
|
||||
with redirect_stdout(f):
|
||||
print('read_verilog temp/uut_%05d.v' % idx)
|
||||
print('proc;;')
|
||||
with open('uut_%05d.ys' % idx, 'w') as f:
|
||||
with gen_tests_makefile.redirect_stdout(f):
|
||||
print('read_verilog uut_%05d.v' % idx)
|
||||
print('proc -noopt;;')
|
||||
print('copy uut_%05d gold' % idx)
|
||||
print('rename uut_%05d gate' % idx)
|
||||
print('tee -a temp/all_share_log.txt log')
|
||||
print('tee -a temp/all_share_log.txt log #job# uut_%05d' % idx)
|
||||
print('tee -a temp/all_share_log.txt wreduce')
|
||||
print('tee -a temp/all_share_log.txt share -aggressive gate')
|
||||
print('tee -o uut_%05d.txt wreduce' % idx)
|
||||
print('tee -a uut_%05d.txt share -aggressive gate' % idx)
|
||||
print('miter -equiv -flatten -ignore_gold_x -make_outputs -make_outcmp gold gate miter')
|
||||
print('sat -set-def-inputs -verify -prove trigger 0 -show-inputs -show-outputs miter')
|
||||
print('! grep -q \'^Removing [246] cells\' uut_%05d.txt' % idx)
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts"])
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
# run this test many times:
|
||||
# time bash -c 'for ((i=0; i<100; i++)); do echo "-- $i --"; bash run-test.sh || exit 1; done'
|
||||
|
||||
set -e
|
||||
|
||||
OPTIND=1
|
||||
count=100
|
||||
seed="" # default to no seed specified
|
||||
while getopts "c:S:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
c) count="$OPTARG" ;;
|
||||
S) seed="-S $OPTARG" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
rm -rf temp
|
||||
mkdir -p temp
|
||||
echo "generating tests.."
|
||||
python3 generate.py -c $count $seed
|
||||
|
||||
echo "running tests.."
|
||||
for i in $( ls temp/*.ys | sed 's,[^0-9],,g; s,^0*\(.\),\1,g;' ); do
|
||||
echo -n "[$i]"
|
||||
idx=$( printf "%05d" $i )
|
||||
../../yosys -ql temp/uut_${idx}.log temp/uut_${idx}.ys
|
||||
done
|
||||
echo
|
||||
|
||||
failed_share=$( echo $( gawk '/^#job#/ { j=$2; db[j]=0; } /^Removing [246] cells/ { delete db[j]; } END { for (j in db) print(j); }' temp/all_share_log.txt ) )
|
||||
if [ -n "$failed_share" ]; then
|
||||
echo "Resource sharing failed for the following test cases: $failed_share"
|
||||
false
|
||||
fi
|
||||
|
||||
exit 0
|
||||
35
tests/sim/generate_mk.py
Normal file
35
tests/sim/generate_mk.py
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
print("Generate FST for sim models")
|
||||
|
||||
for name in Path("tb").rglob("tb*.v"):
|
||||
test_name = name.stem
|
||||
print(f"Test {test_name}")
|
||||
|
||||
verilog_name = f"{test_name[3:]}.v"
|
||||
|
||||
out_file = Path("tb") / f"{test_name}.out"
|
||||
|
||||
subprocess.run(
|
||||
["iverilog", "-o", str(out_file), str(name), verilog_name],
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.DEVNULL,
|
||||
check=True
|
||||
)
|
||||
|
||||
subprocess.run(
|
||||
[str(out_file), "-fst"],
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.DEVNULL,
|
||||
check=True
|
||||
)
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--bash", "--yosys-args", "-w 'Yosys has only limited support for tri-state logic at the moment.'" ])
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
set -eu
|
||||
source ../gen-tests-makefile.sh
|
||||
echo "Generate FST for sim models"
|
||||
find tb/* -name tb*.v | while read name; do
|
||||
test_name=$(basename $name .v)
|
||||
echo "Test $test_name"
|
||||
verilog_name=${test_name:3}.v
|
||||
iverilog -o tb/$test_name.out $name $verilog_name
|
||||
./tb/$test_name.out -fst
|
||||
done
|
||||
generate_mk --yosys-scripts --bash --yosys-args "-w 'Yosys has only limited support for tri-state logic at the moment.'"
|
||||
17
tests/simple/generate_mk.py
Normal file
17
tests/simple/generate_mk.py
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import shutil
|
||||
|
||||
# ----------------------
|
||||
# Check if iverilog is installed
|
||||
# ----------------------
|
||||
if shutil.which("iverilog") is None:
|
||||
print("Error: Icarus Verilog 'iverilog' not found.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate_autotest("*.*v", "")
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
OPTIND=1
|
||||
seed="" # default to no seed specified
|
||||
while getopts "S:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
S) arg="${OPTARG#"${OPTARG%%[![:space:]]*}"}" # remove leading space
|
||||
seed="SEED=$arg" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
# check for Icarus Verilog
|
||||
if ! command -v iverilog > /dev/null ; then
|
||||
echo "$0: Error: Icarus Verilog 'iverilog' not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exec ${MAKE:-make} -f ../tools/autotest.mk $seed *.{sv,v}
|
||||
44
tests/simple_abc9/generate_mk.py
Normal file
44
tests/simple_abc9/generate_mk.py
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import shutil
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# ----------------------
|
||||
# Check if iverilog is installed
|
||||
# ----------------------
|
||||
if shutil.which("iverilog") is None:
|
||||
print("Error: Icarus Verilog 'iverilog' not found.", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
src_dir = Path("../simple")
|
||||
# ----------------------
|
||||
# Copy all files from ../simple to current directory
|
||||
# ----------------------
|
||||
for file in src_dir.glob("*.v"):
|
||||
shutil.copy(file, os.path.join(".", file.name))
|
||||
|
||||
for file in src_dir.glob("*.sv"):
|
||||
shutil.copy(file, os.path.join(".", file.name))
|
||||
|
||||
# bug 2675
|
||||
bug_file = os.path.join(".", "specify.v")
|
||||
if os.path.exists(bug_file):
|
||||
os.remove(bug_file)
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate_autotest("*.*v", "-f \"verilog -noblackbox -specify\" -n 300 -p '\
|
||||
read_verilog -icells -lib +/abc9_model.v; \
|
||||
hierarchy; \
|
||||
synth -run coarse; \
|
||||
opt -full; \
|
||||
techmap; \
|
||||
abc9 -lut 4; \
|
||||
clean; \
|
||||
check -assert * abc9_test037 %d; \
|
||||
select -assert-none t:?_NOT_ t:?_AND_ %%; \
|
||||
setattr -mod -unset blackbox -unset whitebox =*'")
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
source ../common-env.sh
|
||||
|
||||
OPTIND=1
|
||||
seed="" # default to no seed specified
|
||||
while getopts "S:" opt
|
||||
do
|
||||
case "$opt" in
|
||||
S) arg="${OPTARG#"${OPTARG%%[![:space:]]*}"}" # remove leading space
|
||||
seed="SEED=$arg" ;;
|
||||
esac
|
||||
done
|
||||
shift "$((OPTIND-1))"
|
||||
|
||||
# check for Icarus Verilog
|
||||
if ! command -v iverilog > /dev/null ; then
|
||||
echo "$0: Error: Icarus Verilog 'iverilog' not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for file in `ls *.v *.sv`; do
|
||||
if [ ! -f "../simple/$file" -a "$file" != "abc9.v" ]; then
|
||||
echo "Warning: $file is in simple_abc9/, but not in simple/"
|
||||
backup="$file.bak"
|
||||
if [ -f "$backup" ]; then
|
||||
if cmp "$file" "$backup" > /dev/null; then
|
||||
echo " => $backup already exists and matches; removing $file"
|
||||
rm "$file"
|
||||
else
|
||||
echo " => $backup already exists but differs; leaving $file in place"
|
||||
fi
|
||||
else
|
||||
echo " => moving $file to $backup"
|
||||
mv -i "$file" "$backup"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
cp ../simple/*.v .
|
||||
cp ../simple/*.sv .
|
||||
rm specify.v # bug 2675
|
||||
DOLLAR='?'
|
||||
exec ${MAKE:-make} -f ../tools/autotest.mk $seed *.v *.sv EXTRA_FLAGS="-f \"verilog -noblackbox -specify\" -n 300 -p '\
|
||||
read_verilog -icells -lib +/abc9_model.v; \
|
||||
hierarchy; \
|
||||
synth -run coarse; \
|
||||
opt -full; \
|
||||
techmap; \
|
||||
abc9 -lut 4; \
|
||||
clean; \
|
||||
check -assert * abc9_test037 %d; \
|
||||
select -assert-none t:${DOLLAR}_NOT_ t:${DOLLAR}_AND_ %%; \
|
||||
setattr -mod -unset blackbox -unset whitebox =*'"
|
||||
|
||||
# NOTE: Skip 'check -assert' on abc9_test037 because it intentionally has a combinatorial loop
|
||||
|
|
@ -18,19 +18,19 @@ $PWD/../../yosys -p "read_verilog -sv ${TESTNAME}_ref.v ; hierarchy -check -top
|
|||
|
||||
rm -f a.out reference_result.txt dut_result.txt
|
||||
|
||||
iverilog -g2012 ${TESTNAME}_syn.v
|
||||
iverilog -g2012 ${TESTNAME}_ref_syn.v
|
||||
iverilog -g2012 ${TESTNAME}_syn.v >/dev/null 2>&1
|
||||
iverilog -g2012 ${TESTNAME}_ref_syn.v >/dev/null 2>&1
|
||||
|
||||
set +e
|
||||
iverilog -g2012 ${TESTNAME}_tb.v ${TESTNAME}_ref_syn.v
|
||||
./a.out
|
||||
iverilog -g2012 ${TESTNAME}_tb.v ${TESTNAME}_ref_syn.v >/dev/null 2>&1
|
||||
./a.out >/dev/null 2>&1
|
||||
mv output.txt reference_result.txt
|
||||
if [ -f ${TESTNAME}_wrapper.v ] ; then
|
||||
iverilog -g2012 ${TESTNAME}_tb_wrapper.v ${TESTNAME}_syn.v
|
||||
iverilog -g2012 ${TESTNAME}_tb_wrapper.v ${TESTNAME}_syn.v >/dev/null 2>&1
|
||||
else
|
||||
iverilog -g2012 ${TESTNAME}_tb.v ${TESTNAME}_syn.v
|
||||
iverilog -g2012 ${TESTNAME}_tb.v ${TESTNAME}_syn.v >/dev/null 2>&1
|
||||
fi
|
||||
./a.out
|
||||
./a.out >/dev/null 2>&1
|
||||
mv output.txt dut_result.txt
|
||||
|
||||
diff reference_result.txt dut_result.txt > ${TESTNAME}.diff
|
||||
|
|
|
|||
8
tests/svtypes/generate_mk.py
Normal file
8
tests/svtypes/generate_mk.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
sys.path.append("..")
|
||||
|
||||
import gen_tests_makefile
|
||||
|
||||
gen_tests_makefile.generate(["--yosys-scripts", "--prove-sv"])
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue