3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2026-03-23 04:49:15 +00:00
This commit is contained in:
Miodrag Milanović 2026-03-20 15:37:31 +00:00 committed by GitHub
commit 9191491eed
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
114 changed files with 1105 additions and 1095 deletions

View file

@ -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
View file

@ -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
View file

@ -2,3 +2,5 @@
*.out
*.err
run-test.mk
**/Makefile
*.result

133
tests/Makefile Normal file
View 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 {} +

View 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)

View file

@ -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

View file

@ -0,0 +1,8 @@
#!/usr/bin/env python3
import sys
sys.path.append("..")
import gen_tests_makefile
gen_tests_makefile.generate(["--yosys-scripts"])

View file

@ -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

View 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.'" ])

View file

@ -1,5 +0,0 @@
#!/usr/bin/env bash
set -eu
python3 mem_gen.py
source ../../gen-tests-makefile.sh
generate_mk --yosys-scripts --bash

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -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.'"

View file

@ -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

View 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.'" ])

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -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.'"

View 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.'" ])

View file

@ -1,5 +0,0 @@
#!/usr/bin/env bash
set -eu
python3 mem_gen.py
source ../../../gen-tests-makefile.sh
generate_mk --yosys-scripts --bash

View file

@ -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

View 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.'" ])

View file

@ -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.'"

View 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")

View file

@ -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

View file

@ -0,0 +1,8 @@
#!/usr/bin/env python3
import sys
sys.path.append("..")
import gen_tests_makefile
gen_tests_makefile.generate(["--yosys-scripts"])

View file

@ -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

View file

@ -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]

View file

@ -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

View file

@ -0,0 +1,8 @@
#!/usr/bin/env python3
import sys
sys.path.append("..")
import gen_tests_makefile
gen_tests_makefile.generate(["--yosys-scripts"])

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -0,0 +1,8 @@
#!/usr/bin/env python3
import sys
sys.path.append("..")
import gen_tests_makefile
gen_tests_makefile.generate(["--yosys-scripts"])

View file

@ -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
View 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 "=========================="

View file

@ -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

View file

@ -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

View file

@ -1 +1 @@
temp
uut_*.*

View file

@ -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"])

View file

@ -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

View file

@ -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
View 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)

View 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")

View file

@ -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

View file

@ -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

View 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)

View file

@ -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

View file

@ -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)

View file

@ -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"

View 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""")

View file

@ -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
View 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"])

View file

@ -1,4 +0,0 @@
#!/usr/bin/env bash
set -eu
source ../gen-tests-makefile.sh
generate_mk --yosys-scripts --tcl-scripts

View file

@ -1 +1 @@
temp
uut_*.*

View file

@ -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"])

View file

@ -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

View file

@ -0,0 +1,8 @@
#!/usr/bin/env python3
import sys
sys.path.append("..")
import gen_tests_makefile
gen_tests_makefile.generate(["--yosys-scripts"])

View file

@ -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

View file

@ -0,0 +1,8 @@
#!/usr/bin/env python3
import sys
sys.path.append("..")
import gen_tests_makefile
gen_tests_makefile.generate(["--yosys-scripts"])

View file

@ -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

View file

@ -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
View file

@ -0,0 +1,8 @@
#!/usr/bin/env python3
import sys
sys.path.append("..")
import gen_tests_makefile
gen_tests_makefile.generate(["--yosys-scripts"])

View 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"])

View file

@ -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
View file

@ -0,0 +1,8 @@
#!/usr/bin/env python3
import sys
sys.path.append("..")
import gen_tests_makefile
gen_tests_makefile.generate(["--yosys-scripts"])

View file

@ -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
View 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"])

View file

@ -1,4 +0,0 @@
#!/usr/bin/env bash
set -eu
source ../gen-tests-makefile.sh
generate_mk --yosys-scripts --bash

View file

@ -0,0 +1,8 @@
#!/usr/bin/env python3
import sys
sys.path.append("..")
import gen_tests_makefile
gen_tests_makefile.generate(["--yosys-scripts"])

View file

@ -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

View file

@ -1 +1 @@
temp
uut_*.*

View file

@ -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"])

View file

@ -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
View 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.'" ])

View file

@ -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.'"

View 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", "")

View file

@ -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}

View 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 =*'")

View file

@ -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

View file

@ -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

View 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