mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-06 06:03:23 +00:00
Merge remote-tracking branch 'origin/master' into xc7dsp
This commit is contained in:
commit
ed303b07b7
25 changed files with 219 additions and 86 deletions
|
@ -36,6 +36,7 @@ matrix:
|
||||||
- libboost-system-dev
|
- libboost-system-dev
|
||||||
- libboost-python-dev
|
- libboost-python-dev
|
||||||
- libboost-filesystem-dev
|
- libboost-filesystem-dev
|
||||||
|
- zlib1g-dev
|
||||||
env:
|
env:
|
||||||
- MATRIX_EVAL="CONFIG=gcc && CC=gcc-4.8 && CXX=g++-4.8"
|
- MATRIX_EVAL="CONFIG=gcc && CC=gcc-4.8 && CXX=g++-4.8"
|
||||||
|
|
||||||
|
@ -64,6 +65,7 @@ matrix:
|
||||||
- libboost-system-dev
|
- libboost-system-dev
|
||||||
- libboost-python-dev
|
- libboost-python-dev
|
||||||
- libboost-filesystem-dev
|
- libboost-filesystem-dev
|
||||||
|
- zlib1g-dev
|
||||||
env:
|
env:
|
||||||
- MATRIX_EVAL="CONFIG=gcc && CC=gcc-6 && CXX=g++-6"
|
- MATRIX_EVAL="CONFIG=gcc && CC=gcc-6 && CXX=g++-6"
|
||||||
|
|
||||||
|
@ -92,6 +94,7 @@ matrix:
|
||||||
- libboost-system-dev
|
- libboost-system-dev
|
||||||
- libboost-python-dev
|
- libboost-python-dev
|
||||||
- libboost-filesystem-dev
|
- libboost-filesystem-dev
|
||||||
|
- zlib1g-dev
|
||||||
env:
|
env:
|
||||||
- MATRIX_EVAL="CONFIG=gcc && CC=gcc-7 && CXX=g++-7"
|
- MATRIX_EVAL="CONFIG=gcc && CC=gcc-7 && CXX=g++-7"
|
||||||
|
|
||||||
|
@ -121,6 +124,7 @@ matrix:
|
||||||
- libboost-system-dev
|
- libboost-system-dev
|
||||||
- libboost-python-dev
|
- libboost-python-dev
|
||||||
- libboost-filesystem-dev
|
- libboost-filesystem-dev
|
||||||
|
- zlib1g-dev
|
||||||
env:
|
env:
|
||||||
- MATRIX_EVAL="CONFIG=clang && CC=clang-3.8 && CXX=clang++-3.8"
|
- MATRIX_EVAL="CONFIG=clang && CC=clang-3.8 && CXX=clang++-3.8"
|
||||||
|
|
||||||
|
@ -149,6 +153,7 @@ matrix:
|
||||||
- libboost-system-dev
|
- libboost-system-dev
|
||||||
- libboost-python-dev
|
- libboost-python-dev
|
||||||
- libboost-filesystem-dev
|
- libboost-filesystem-dev
|
||||||
|
- zlib1g-dev
|
||||||
env:
|
env:
|
||||||
- MATRIX_EVAL="CONFIG=clang && CC=clang-5.0 && CXX=clang++-5.0"
|
- MATRIX_EVAL="CONFIG=clang && CC=clang-5.0 && CXX=clang++-5.0"
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ Yosys 0.9 .. Yosys 0.9-dev
|
||||||
- Added "synth -abc9" (experimental)
|
- Added "synth -abc9" (experimental)
|
||||||
- Added "script -scriptwire
|
- Added "script -scriptwire
|
||||||
- "synth_xilinx" to now infer wide multiplexers (-widemux <min> to enable)
|
- "synth_xilinx" to now infer wide multiplexers (-widemux <min> to enable)
|
||||||
|
- Added automatic gzip decompression for frontends
|
||||||
|
|
||||||
Yosys 0.8 .. Yosys 0.8-dev
|
Yosys 0.8 .. Yosys 0.8-dev
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
9
Makefile
9
Makefile
|
@ -19,6 +19,7 @@ ENABLE_VERIFIC := 0
|
||||||
ENABLE_COVER := 1
|
ENABLE_COVER := 1
|
||||||
ENABLE_LIBYOSYS := 0
|
ENABLE_LIBYOSYS := 0
|
||||||
ENABLE_PROTOBUF := 0
|
ENABLE_PROTOBUF := 0
|
||||||
|
ENABLE_ZLIB := 1
|
||||||
|
|
||||||
# python wrappers
|
# python wrappers
|
||||||
ENABLE_PYOSYS := 0
|
ENABLE_PYOSYS := 0
|
||||||
|
@ -122,7 +123,7 @@ OBJS = kernel/version_$(GIT_REV).o
|
||||||
# is just a symlink to your actual ABC working directory, as 'make mrproper'
|
# is just a symlink to your actual ABC working directory, as 'make mrproper'
|
||||||
# will remove the 'abc' directory and you do not want to accidentally
|
# will remove the 'abc' directory and you do not want to accidentally
|
||||||
# delete your work on ABC..
|
# delete your work on ABC..
|
||||||
ABCREV = 62487de
|
ABCREV = 5776ad0
|
||||||
ABCPULL = 1
|
ABCPULL = 1
|
||||||
ABCURL ?= https://github.com/berkeley-abc/abc
|
ABCURL ?= https://github.com/berkeley-abc/abc
|
||||||
ABCMKARGS = CC="$(CXX)" CXX="$(CXX)" ABC_USE_LIBSTDCXX=1
|
ABCMKARGS = CC="$(CXX)" CXX="$(CXX)" ABC_USE_LIBSTDCXX=1
|
||||||
|
@ -384,6 +385,12 @@ ifeq ($(ENABLE_GLOB),1)
|
||||||
CXXFLAGS += -DYOSYS_ENABLE_GLOB
|
CXXFLAGS += -DYOSYS_ENABLE_GLOB
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_ZLIB),1)
|
||||||
|
CXXFLAGS += -DYOSYS_ENABLE_ZLIB
|
||||||
|
LDLIBS += -lz
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
ifeq ($(ENABLE_TCL),1)
|
ifeq ($(ENABLE_TCL),1)
|
||||||
TCL_VERSION ?= tcl$(shell bash -c "tclsh <(echo 'puts [info tclversion]')")
|
TCL_VERSION ?= tcl$(shell bash -c "tclsh <(echo 'puts [info tclversion]')")
|
||||||
ifeq ($(OS), FreeBSD)
|
ifeq ($(OS), FreeBSD)
|
||||||
|
|
73
README.md
73
README.md
|
@ -67,13 +67,13 @@ prerequisites for building yosys:
|
||||||
$ sudo apt-get install build-essential clang bison flex \
|
$ sudo apt-get install build-essential clang bison flex \
|
||||||
libreadline-dev gawk tcl-dev libffi-dev git \
|
libreadline-dev gawk tcl-dev libffi-dev git \
|
||||||
graphviz xdot pkg-config python3 libboost-system-dev \
|
graphviz xdot pkg-config python3 libboost-system-dev \
|
||||||
libboost-python-dev libboost-filesystem-dev
|
libboost-python-dev libboost-filesystem-dev zlib1g-dev
|
||||||
|
|
||||||
Similarily, on Mac OS X MacPorts or Homebrew can be used to install dependencies:
|
Similarily, on Mac OS X MacPorts or Homebrew can be used to install dependencies:
|
||||||
|
|
||||||
$ brew tap Homebrew/bundle && brew bundle
|
$ brew tap Homebrew/bundle && brew bundle
|
||||||
$ sudo port install bison flex readline gawk libffi \
|
$ sudo port install bison flex readline gawk libffi \
|
||||||
git graphviz pkgconfig python36 boost
|
git graphviz pkgconfig python36 boost zlib
|
||||||
|
|
||||||
On FreeBSD use the following command to install all prerequisites:
|
On FreeBSD use the following command to install all prerequisites:
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ On FreeBSD system use gmake instead of make. To run tests use:
|
||||||
|
|
||||||
For Cygwin use the following command to install all prerequisites, or select these additional packages:
|
For Cygwin use the following command to install all prerequisites, or select these additional packages:
|
||||||
|
|
||||||
setup-x86_64.exe -q --packages=bison,flex,gcc-core,gcc-g++,git,libffi-devel,libreadline-devel,make,pkg-config,python3,tcl-devel,boost-build
|
setup-x86_64.exe -q --packages=bison,flex,gcc-core,gcc-g++,git,libffi-devel,libreadline-devel,make,pkg-config,python3,tcl-devel,boost-build,zlib-devel
|
||||||
|
|
||||||
There are also pre-compiled Yosys binary packages for Ubuntu and Win32 as well
|
There are also pre-compiled Yosys binary packages for Ubuntu and Win32 as well
|
||||||
as a source distribution for Visual Studio. Visit the Yosys download page for
|
as a source distribution for Visual Studio. Visit the Yosys download page for
|
||||||
|
@ -130,18 +130,15 @@ commands and ``help <command>`` to print details on the specified command:
|
||||||
|
|
||||||
yosys> help help
|
yosys> help help
|
||||||
|
|
||||||
reading the design using the Verilog frontend:
|
reading and elaborating the design using the Verilog frontend:
|
||||||
|
|
||||||
yosys> read_verilog tests/simple/fiedler-cooley.v
|
yosys> read -sv tests/simple/fiedler-cooley.v
|
||||||
|
yosys> hierarchy -top up3down5
|
||||||
|
|
||||||
writing the design to the console in Yosys's internal format:
|
writing the design to the console in Yosys's internal format:
|
||||||
|
|
||||||
yosys> write_ilang
|
yosys> write_ilang
|
||||||
|
|
||||||
elaborate design hierarchy:
|
|
||||||
|
|
||||||
yosys> hierarchy
|
|
||||||
|
|
||||||
convert processes (``always`` blocks) to netlist elements and perform
|
convert processes (``always`` blocks) to netlist elements and perform
|
||||||
some simple optimizations:
|
some simple optimizations:
|
||||||
|
|
||||||
|
@ -163,51 +160,26 @@ write design netlist to a new Verilog file:
|
||||||
|
|
||||||
yosys> write_verilog synth.v
|
yosys> write_verilog synth.v
|
||||||
|
|
||||||
a similar synthesis can be performed using yosys command line options only:
|
|
||||||
|
|
||||||
$ ./yosys -o synth.v -p hierarchy -p proc -p opt \
|
|
||||||
-p techmap -p opt tests/simple/fiedler-cooley.v
|
|
||||||
|
|
||||||
or using a simple synthesis script:
|
or using a simple synthesis script:
|
||||||
|
|
||||||
$ cat synth.ys
|
$ cat synth.ys
|
||||||
read_verilog tests/simple/fiedler-cooley.v
|
read -sv tests/simple/fiedler-cooley.v
|
||||||
hierarchy; proc; opt; techmap; opt
|
hierarchy -top up3down5
|
||||||
|
proc; opt; techmap; opt
|
||||||
write_verilog synth.v
|
write_verilog synth.v
|
||||||
|
|
||||||
$ ./yosys synth.ys
|
$ ./yosys synth.ys
|
||||||
|
|
||||||
It is also possible to only have the synthesis commands but not the read/write
|
|
||||||
commands in the synthesis script:
|
|
||||||
|
|
||||||
$ cat synth.ys
|
|
||||||
hierarchy; proc; opt; techmap; opt
|
|
||||||
|
|
||||||
$ ./yosys -o synth.v tests/simple/fiedler-cooley.v synth.ys
|
|
||||||
|
|
||||||
The following very basic synthesis script should work well with all designs:
|
|
||||||
|
|
||||||
# check design hierarchy
|
|
||||||
hierarchy
|
|
||||||
|
|
||||||
# translate processes (always blocks)
|
|
||||||
proc; opt
|
|
||||||
|
|
||||||
# detect and optimize FSM encodings
|
|
||||||
fsm; opt
|
|
||||||
|
|
||||||
# implement memories (arrays)
|
|
||||||
memory; opt
|
|
||||||
|
|
||||||
# convert to gate logic
|
|
||||||
techmap; opt
|
|
||||||
|
|
||||||
If ABC is enabled in the Yosys build configuration and a cell library is given
|
If ABC is enabled in the Yosys build configuration and a cell library is given
|
||||||
in the liberty file ``mycells.lib``, the following synthesis script will
|
in the liberty file ``mycells.lib``, the following synthesis script will
|
||||||
synthesize for the given cell library:
|
synthesize for the given cell library:
|
||||||
|
|
||||||
|
# read design
|
||||||
|
read -sv tests/simple/fiedler-cooley.v
|
||||||
|
hierarchy -top up3down5
|
||||||
|
|
||||||
# the high-level stuff
|
# the high-level stuff
|
||||||
hierarchy; proc; fsm; opt; memory; opt
|
proc; fsm; opt; memory; opt
|
||||||
|
|
||||||
# mapping to internal cell library
|
# mapping to internal cell library
|
||||||
techmap; opt
|
techmap; opt
|
||||||
|
@ -222,7 +194,8 @@ synthesize for the given cell library:
|
||||||
clean
|
clean
|
||||||
|
|
||||||
If you do not have a liberty file but want to test this synthesis script,
|
If you do not have a liberty file but want to test this synthesis script,
|
||||||
you can use the file ``examples/cmos/cmos_cells.lib`` from the yosys sources.
|
you can use the file ``examples/cmos/cmos_cells.lib`` from the yosys sources
|
||||||
|
as simple example.
|
||||||
|
|
||||||
Liberty file downloads for and information about free and open ASIC standard
|
Liberty file downloads for and information about free and open ASIC standard
|
||||||
cell libraries can be found here:
|
cell libraries can be found here:
|
||||||
|
@ -231,20 +204,18 @@ cell libraries can be found here:
|
||||||
- http://www.vlsitechnology.org/synopsys/vsclib013.lib
|
- http://www.vlsitechnology.org/synopsys/vsclib013.lib
|
||||||
|
|
||||||
The command ``synth`` provides a good default synthesis script (see
|
The command ``synth`` provides a good default synthesis script (see
|
||||||
``help synth``). If possible a synthesis script should borrow from ``synth``.
|
``help synth``):
|
||||||
For example:
|
|
||||||
|
|
||||||
# the high-level stuff
|
read -sv tests/simple/fiedler-cooley.v
|
||||||
hierarchy
|
synth -top up3down5
|
||||||
synth -run coarse
|
|
||||||
|
|
||||||
# mapping to internal cells
|
# mapping to target cells
|
||||||
techmap; opt -fast
|
|
||||||
dfflibmap -liberty mycells.lib
|
dfflibmap -liberty mycells.lib
|
||||||
abc -liberty mycells.lib
|
abc -liberty mycells.lib
|
||||||
clean
|
clean
|
||||||
|
|
||||||
Yosys is under construction. A more detailed documentation will follow.
|
The command ``prep`` provides a good default word-level synthesis script, as
|
||||||
|
used in SMT-based formal verification.
|
||||||
|
|
||||||
|
|
||||||
Unsupported Verilog-2005 Features
|
Unsupported Verilog-2005 Features
|
||||||
|
|
8
examples/mimas2/README
Normal file
8
examples/mimas2/README
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
A simple example design, based on the Numato Labs Mimas V2 board
|
||||||
|
================================================================
|
||||||
|
|
||||||
|
This example uses Yosys for synthesis and Xilinx ISE
|
||||||
|
for place&route and bit-stream creation.
|
||||||
|
|
||||||
|
To synthesize:
|
||||||
|
bash run.sh
|
13
examples/mimas2/example.ucf
Normal file
13
examples/mimas2/example.ucf
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
CONFIG VCCAUX = "3.3" ;
|
||||||
|
|
||||||
|
|
||||||
|
NET "CLK" LOC = D9 | IOSTANDARD = LVCMOS33 | PERIOD = 12MHz ;
|
||||||
|
|
||||||
|
NET "LED[7]" LOC = P15 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[6]" LOC = P16 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[5]" LOC = N15 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[4]" LOC = N16 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[3]" LOC = U17 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[2]" LOC = U18 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[1]" LOC = T17 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
||||||
|
NET "LED[0]" LOC = T18 | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW ;
|
14
examples/mimas2/example.v
Normal file
14
examples/mimas2/example.v
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
module example(
|
||||||
|
input wire CLK,
|
||||||
|
output wire [7:0] LED
|
||||||
|
);
|
||||||
|
|
||||||
|
reg [27:0] ctr;
|
||||||
|
initial ctr = 0;
|
||||||
|
|
||||||
|
always @(posedge CLK)
|
||||||
|
ctr <= ctr + 1;
|
||||||
|
|
||||||
|
assign LED = ctr[27:20];
|
||||||
|
|
||||||
|
endmodule
|
8
examples/mimas2/run.sh
Normal file
8
examples/mimas2/run.sh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
yosys run_yosys.ys
|
||||||
|
edif2ngd example.edif
|
||||||
|
ngdbuild example -uc example.ucf -p xc6slx9csg324-3
|
||||||
|
map -w example
|
||||||
|
par -w example.ncd example_par.ncd
|
||||||
|
bitgen -w example_par.ncd -g StartupClk:JTAGClk
|
4
examples/mimas2/run_yosys.ys
Normal file
4
examples/mimas2/run_yosys.ys
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
read_verilog example.v
|
||||||
|
synth_xilinx -top example -family xc6s
|
||||||
|
iopadmap -bits -outpad OBUF I:O -inpad IBUF O:I
|
||||||
|
write_edif -pvector bra example.edif
|
|
@ -1551,7 +1551,9 @@ RTLIL::Module *AstModule::clone() const
|
||||||
new_mod->nomeminit = nomeminit;
|
new_mod->nomeminit = nomeminit;
|
||||||
new_mod->nomem2reg = nomem2reg;
|
new_mod->nomem2reg = nomem2reg;
|
||||||
new_mod->mem2reg = mem2reg;
|
new_mod->mem2reg = mem2reg;
|
||||||
|
new_mod->noblackbox = noblackbox;
|
||||||
new_mod->lib = lib;
|
new_mod->lib = lib;
|
||||||
|
new_mod->nowb = nowb;
|
||||||
new_mod->noopt = noopt;
|
new_mod->noopt = noopt;
|
||||||
new_mod->icells = icells;
|
new_mod->icells = icells;
|
||||||
new_mod->pwires = pwires;
|
new_mod->pwires = pwires;
|
||||||
|
|
|
@ -2484,7 +2484,7 @@ struct ReadPass : public Pass {
|
||||||
args[0] = "verific";
|
args[0] = "verific";
|
||||||
} else {
|
} else {
|
||||||
args[0] = "read_verilog";
|
args[0] = "read_verilog";
|
||||||
args.erase(args.begin()+1, args.begin()+2);
|
args[1] = "-defer";
|
||||||
}
|
}
|
||||||
Pass::call(design, args);
|
Pass::call(design, args);
|
||||||
return;
|
return;
|
||||||
|
@ -2498,6 +2498,7 @@ struct ReadPass : public Pass {
|
||||||
if (args[1] == "-formal")
|
if (args[1] == "-formal")
|
||||||
args.insert(args.begin()+1, std::string());
|
args.insert(args.begin()+1, std::string());
|
||||||
args[1] = "-sv";
|
args[1] = "-sv";
|
||||||
|
args.insert(args.begin()+1, "-defer");
|
||||||
}
|
}
|
||||||
Pass::call(design, args);
|
Pass::call(design, args);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -70,6 +70,9 @@ YOSYS_NAMESPACE_END
|
||||||
#define YY_INPUT(buf,result,max_size) \
|
#define YY_INPUT(buf,result,max_size) \
|
||||||
result = readsome(*VERILOG_FRONTEND::lexin, buf, max_size)
|
result = readsome(*VERILOG_FRONTEND::lexin, buf, max_size)
|
||||||
|
|
||||||
|
#undef YY_BUF_SIZE
|
||||||
|
#define YY_BUF_SIZE 65536
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%option yylineno
|
%option yylineno
|
||||||
|
|
|
@ -25,6 +25,26 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#ifdef YOSYS_ENABLE_ZLIB
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
PRIVATE_NAMESPACE_BEGIN
|
||||||
|
#define GZ_BUFFER_SIZE 8192
|
||||||
|
void decompress_gzip(const std::string &filename, std::stringstream &out)
|
||||||
|
{
|
||||||
|
char buffer[GZ_BUFFER_SIZE];
|
||||||
|
int bytes_read;
|
||||||
|
gzFile gzf = gzopen(filename.c_str(), "rb");
|
||||||
|
while(!gzeof(gzf)) {
|
||||||
|
bytes_read = gzread(gzf, reinterpret_cast<void *>(buffer), GZ_BUFFER_SIZE);
|
||||||
|
out.write(buffer, bytes_read);
|
||||||
|
}
|
||||||
|
gzclose(gzf);
|
||||||
|
}
|
||||||
|
PRIVATE_NAMESPACE_END
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
YOSYS_NAMESPACE_BEGIN
|
YOSYS_NAMESPACE_BEGIN
|
||||||
|
|
||||||
#define MAX_REG_COUNT 1000
|
#define MAX_REG_COUNT 1000
|
||||||
|
@ -436,6 +456,28 @@ void Frontend::extra_args(std::istream *&f, std::string &filename, std::vector<s
|
||||||
delete ff;
|
delete ff;
|
||||||
else
|
else
|
||||||
f = ff;
|
f = ff;
|
||||||
|
if (f != NULL) {
|
||||||
|
// Check for gzip magic
|
||||||
|
unsigned char magic[3];
|
||||||
|
int n = readsome(*ff, reinterpret_cast<char*>(magic), 3);
|
||||||
|
if (n == 3 && magic[0] == 0x1f && magic[1] == 0x8b) {
|
||||||
|
#ifdef YOSYS_ENABLE_ZLIB
|
||||||
|
log("Found gzip magic in file `%s', decompressing using zlib.\n", filename.c_str());
|
||||||
|
if (magic[2] != 8)
|
||||||
|
log_cmd_error("gzip file `%s' uses unsupported compression type %02x\n",
|
||||||
|
filename.c_str(), unsigned(magic[2]));
|
||||||
|
delete ff;
|
||||||
|
std::stringstream *df = new std::stringstream();
|
||||||
|
decompress_gzip(filename, *df);
|
||||||
|
f = df;
|
||||||
|
#else
|
||||||
|
log_cmd_error("File `%s' is a gzip file, but Yosys is compiled without zlib.\n", filename.c_str());
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
ff->clear();
|
||||||
|
ff->seekg(0, std::ios::beg);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
log_cmd_error("Can't open input file `%s' for reading: %s\n", filename.c_str(), strerror(errno));
|
log_cmd_error("Can't open input file `%s' for reading: %s\n", filename.c_str(), strerror(errno));
|
||||||
|
|
|
@ -420,8 +420,12 @@ namespace RTLIL
|
||||||
// It maintains a reference counter that is used to make sure that the container is not modified while being iterated over.
|
// It maintains a reference counter that is used to make sure that the container is not modified while being iterated over.
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct ObjIterator
|
struct ObjIterator {
|
||||||
{
|
using iterator_category = std::forward_iterator_tag;
|
||||||
|
using value_type = T;
|
||||||
|
using difference_type = ptrdiff_t;
|
||||||
|
using pointer = T*;
|
||||||
|
using reference = T&;
|
||||||
typename dict<RTLIL::IdString, T>::iterator it;
|
typename dict<RTLIL::IdString, T>::iterator it;
|
||||||
dict<RTLIL::IdString, T> *list_p;
|
dict<RTLIL::IdString, T> *list_p;
|
||||||
int *refcount_p;
|
int *refcount_p;
|
||||||
|
@ -474,13 +478,25 @@ namespace RTLIL
|
||||||
return it != other.it;
|
return it != other.it;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void operator++() {
|
|
||||||
|
inline bool operator==(const RTLIL::ObjIterator<T> &other) const {
|
||||||
|
return !(*this != other);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline ObjIterator<T>& operator++() {
|
||||||
log_assert(list_p != nullptr);
|
log_assert(list_p != nullptr);
|
||||||
if (++it == list_p->end()) {
|
if (++it == list_p->end()) {
|
||||||
(*refcount_p)--;
|
(*refcount_p)--;
|
||||||
list_p = nullptr;
|
list_p = nullptr;
|
||||||
refcount_p = nullptr;
|
refcount_p = nullptr;
|
||||||
}
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const ObjIterator<T> operator++(int) {
|
||||||
|
ObjIterator<T> result(*this);
|
||||||
|
++(*this);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -894,23 +894,26 @@ void run_frontend(std::string filename, std::string command, std::string *backen
|
||||||
design = yosys_design;
|
design = yosys_design;
|
||||||
|
|
||||||
if (command == "auto") {
|
if (command == "auto") {
|
||||||
if (filename.size() > 2 && filename.substr(filename.size()-2) == ".v")
|
std::string filename_trim = filename;
|
||||||
|
if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-3) == ".gz")
|
||||||
|
filename_trim.erase(filename_trim.size()-3);
|
||||||
|
if (filename_trim.size() > 2 && filename_trim.substr(filename_trim.size()-2) == ".v")
|
||||||
command = "verilog";
|
command = "verilog";
|
||||||
else if (filename.size() > 2 && filename.substr(filename.size()-3) == ".sv")
|
else if (filename_trim.size() > 2 && filename_trim.substr(filename_trim.size()-3) == ".sv")
|
||||||
command = "verilog -sv";
|
command = "verilog -sv";
|
||||||
else if (filename.size() > 3 && filename.substr(filename.size()-4) == ".vhd")
|
else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-4) == ".vhd")
|
||||||
command = "vhdl";
|
command = "vhdl";
|
||||||
else if (filename.size() > 4 && filename.substr(filename.size()-5) == ".blif")
|
else if (filename_trim.size() > 4 && filename_trim.substr(filename_trim.size()-5) == ".blif")
|
||||||
command = "blif";
|
command = "blif";
|
||||||
else if (filename.size() > 5 && filename.substr(filename.size()-6) == ".eblif")
|
else if (filename_trim.size() > 5 && filename_trim.substr(filename_trim.size()-6) == ".eblif")
|
||||||
command = "blif";
|
command = "blif";
|
||||||
else if (filename.size() > 4 && filename.substr(filename.size()-5) == ".json")
|
else if (filename_trim.size() > 4 && filename_trim.substr(filename_trim.size()-5) == ".json")
|
||||||
command = "json";
|
command = "json";
|
||||||
else if (filename.size() > 3 && filename.substr(filename.size()-3) == ".il")
|
else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-3) == ".il")
|
||||||
command = "ilang";
|
command = "ilang";
|
||||||
else if (filename.size() > 3 && filename.substr(filename.size()-3) == ".ys")
|
else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-3) == ".ys")
|
||||||
command = "script";
|
command = "script";
|
||||||
else if (filename.size() > 3 && filename.substr(filename.size()-4) == ".tcl")
|
else if (filename_trim.size() > 3 && filename_trim.substr(filename_trim.size()-4) == ".tcl")
|
||||||
command = "tcl";
|
command = "tcl";
|
||||||
else if (filename == "-")
|
else if (filename == "-")
|
||||||
command = "script";
|
command = "script";
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
|
@ -223,6 +223,33 @@ struct statdata_t
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" Estimated number of LCs: %10d\n", lc_cnt);
|
log(" Estimated number of LCs: %10d\n", lc_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tech == "cmos")
|
||||||
|
{
|
||||||
|
int tran_cnt = 0;
|
||||||
|
bool tran_cnt_exact = true;
|
||||||
|
|
||||||
|
for (auto it : num_cells_by_type) {
|
||||||
|
auto ctype = it.first;
|
||||||
|
auto cnum = it.second;
|
||||||
|
|
||||||
|
if (ctype == "$_NOT_")
|
||||||
|
tran_cnt += 2*cnum;
|
||||||
|
else if (ctype.in("$_NAND_", "$_NOR_"))
|
||||||
|
tran_cnt += 4*cnum;
|
||||||
|
else if (ctype.in("$_AOI3_", "$_OAI3_"))
|
||||||
|
tran_cnt += 6*cnum;
|
||||||
|
else if (ctype.in("$_AOI4_", "$_OAI4_"))
|
||||||
|
tran_cnt += 8*cnum;
|
||||||
|
else if (ctype.in("$_DFF_P_", "$_DFF_N_"))
|
||||||
|
tran_cnt += 16*cnum;
|
||||||
|
else
|
||||||
|
tran_cnt_exact = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
log("\n");
|
||||||
|
log(" Estimated number of transistors: %10d%s\n", tran_cnt, tran_cnt_exact ? "" : "+");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -286,7 +313,7 @@ struct StatPass : public Pass {
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -tech <technology>\n");
|
log(" -tech <technology>\n");
|
||||||
log(" print area estemate for the specified technology. Currently supported\n");
|
log(" print area estemate for the specified technology. Currently supported\n");
|
||||||
log(" values for <technology>: xilinx\n");
|
log(" values for <technology>: xilinx, cmos\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -width\n");
|
log(" -width\n");
|
||||||
log(" annotate internal cell types with their word width.\n");
|
log(" annotate internal cell types with their word width.\n");
|
||||||
|
@ -330,7 +357,7 @@ struct StatPass : public Pass {
|
||||||
}
|
}
|
||||||
extra_args(args, argidx, design);
|
extra_args(args, argidx, design);
|
||||||
|
|
||||||
if (techname != "" && techname != "xilinx")
|
if (techname != "" && techname != "xilinx" && techname != "cmos")
|
||||||
log_cmd_error("Unsupported technology: '%s'\n", techname.c_str());
|
log_cmd_error("Unsupported technology: '%s'\n", techname.c_str());
|
||||||
|
|
||||||
for (auto mod : design->selected_modules())
|
for (auto mod : design->selected_modules())
|
||||||
|
|
|
@ -3,8 +3,8 @@ OBJS += techlibs/intel/synth_intel.o
|
||||||
|
|
||||||
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/m9k_bb.v))
|
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/m9k_bb.v))
|
||||||
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/altpll_bb.v))
|
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/altpll_bb.v))
|
||||||
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/brams.txt))
|
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/brams_m9k.txt))
|
||||||
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/brams_map.v))
|
$(eval $(call add_share_file,share/intel/common,techlibs/intel/common/brams_map_m9k.v))
|
||||||
$(eval $(call add_share_file,share/intel/max10,techlibs/intel/max10/cells_sim.v))
|
$(eval $(call add_share_file,share/intel/max10,techlibs/intel/max10/cells_sim.v))
|
||||||
$(eval $(call add_share_file,share/intel/a10gx,techlibs/intel/a10gx/cells_sim.v))
|
$(eval $(call add_share_file,share/intel/a10gx,techlibs/intel/a10gx/cells_sim.v))
|
||||||
$(eval $(call add_share_file,share/intel/cyclonev,techlibs/intel/cyclonev/cells_sim.v))
|
$(eval $(call add_share_file,share/intel/cyclonev,techlibs/intel/cyclonev/cells_sim.v))
|
||||||
|
|
|
@ -61,8 +61,8 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
log(" from label is synonymous to 'begin', and empty to label is\n");
|
log(" from label is synonymous to 'begin', and empty to label is\n");
|
||||||
log(" synonymous to the end of the command list.\n");
|
log(" synonymous to the end of the command list.\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -noiopads\n");
|
log(" -iopads\n");
|
||||||
log(" do not use IO pad cells in output netlist\n");
|
log(" use IO pad cells in output netlist\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -nobram\n");
|
log(" -nobram\n");
|
||||||
log(" do not use block RAM cells in output netlist\n");
|
log(" do not use block RAM cells in output netlist\n");
|
||||||
|
@ -79,7 +79,7 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
}
|
}
|
||||||
|
|
||||||
string top_opt, family_opt, vout_file, blif_file;
|
string top_opt, family_opt, vout_file, blif_file;
|
||||||
bool retime, flatten, nobram, noiopads;
|
bool retime, flatten, nobram, iopads;
|
||||||
|
|
||||||
void clear_flags() YS_OVERRIDE
|
void clear_flags() YS_OVERRIDE
|
||||||
{
|
{
|
||||||
|
@ -90,7 +90,7 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
retime = false;
|
retime = false;
|
||||||
flatten = true;
|
flatten = true;
|
||||||
nobram = false;
|
nobram = false;
|
||||||
noiopads = false;
|
iopads = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
|
void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
|
||||||
|
@ -125,8 +125,8 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
run_to = args[argidx].substr(pos + 1);
|
run_to = args[argidx].substr(pos + 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (args[argidx] == "-noiopads") {
|
if (args[argidx] == "-iopads") {
|
||||||
noiopads = true;
|
iopads = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (args[argidx] == "-nobram") {
|
if (args[argidx] == "-nobram") {
|
||||||
|
@ -187,8 +187,15 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nobram && check_label("map_bram", "(skip if -nobram)")) {
|
if (!nobram && check_label("map_bram", "(skip if -nobram)")) {
|
||||||
run("memory_bram -rules +/intel/common/brams.txt");
|
if (family_opt == "cycloneiv" ||
|
||||||
run("techmap -map +/intel/common/brams_map.v");
|
family_opt == "cycloneive" ||
|
||||||
|
family_opt == "max10" ||
|
||||||
|
help_mode) {
|
||||||
|
run("memory_bram -rules +/intel/common/brams_m9k.txt", "(if applicable for family)");
|
||||||
|
run("techmap -map +/intel/common/brams_map_m9k.v", "(if applicable for family)");
|
||||||
|
} else {
|
||||||
|
log_warning("BRAM mapping is not currently supported for %s.\n", family_opt.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_label("map_ffram")) {
|
if (check_label("map_ffram")) {
|
||||||
|
@ -215,10 +222,9 @@ struct SynthIntelPass : public ScriptPass {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_label("map_cells")) {
|
if (check_label("map_cells")) {
|
||||||
if (!noiopads)
|
if (iopads || help_mode)
|
||||||
run("iopadmap -bits -outpad $__outpad I:O -inpad $__inpad O:I", "(unless -noiopads)");
|
run("iopadmap -bits -outpad $__outpad I:O -inpad $__inpad O:I", "(if -iopads)");
|
||||||
run(stringf("techmap -map +/intel/%s/cells_map.v", family_opt.c_str()));
|
run(stringf("techmap -map +/intel/%s/cells_map.v", family_opt.c_str()));
|
||||||
|
|
||||||
run("dffinit -highlow -ff dffeas q power_up");
|
run("dffinit -highlow -ff dffeas q power_up");
|
||||||
run("clean -purge");
|
run("clean -purge");
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,9 +24,9 @@ module _90_dff_nn0_to_np0 (input D, C, R, output Q); \$_DFF_NP0_ _TECHMAP_REPLA
|
||||||
(* techmap_celltype = "$_DFF_PN0_" *)
|
(* techmap_celltype = "$_DFF_PN0_" *)
|
||||||
module _90_dff_pn0_to_pp0 (input D, C, R, output Q); \$_DFF_PP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dff_pn0_to_pp0 (input D, C, R, output Q); \$_DFF_PP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
(* techmap_celltype = "$_DFF_NN1_" *)
|
(* techmap_celltype = "$_DFF_NN1_" *)
|
||||||
module _90_dff_nn1_to_np1 (input D, C, R, output Q); \$_DFF_NP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dff_nn1_to_np1 (input D, C, R, output Q); \$_DFF_NP1_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
(* techmap_celltype = "$_DFF_PN1_" *)
|
(* techmap_celltype = "$_DFF_PN1_" *)
|
||||||
module _90_dff_pn1_to_pp1 (input D, C, R, output Q); \$_DFF_PP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dff_pn1_to_pp1 (input D, C, R, output Q); \$_DFF_PP1_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
|
|
||||||
module \$__SHREG_ (input C, input D, input E, output Q);
|
module \$__SHREG_ (input C, input D, input E, output Q);
|
||||||
parameter DEPTH = 0;
|
parameter DEPTH = 0;
|
||||||
|
|
|
@ -52,7 +52,7 @@ module \$__XILINX_RAMB8BWER_SDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DAT
|
||||||
.CLKBRDCLK(CLK2 ^ !CLKPOL2),
|
.CLKBRDCLK(CLK2 ^ !CLKPOL2),
|
||||||
.ENBRDEN(A1EN),
|
.ENBRDEN(A1EN),
|
||||||
.REGCEBREGCE(|1),
|
.REGCEBREGCE(|1),
|
||||||
.RSTB(|0)
|
.RSTBRST(|0)
|
||||||
);
|
);
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
@ -217,7 +217,7 @@ module \$__XILINX_RAMB8BWER_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DAT
|
||||||
.CLKBRDCLK(CLK3 ^ !CLKPOL3),
|
.CLKBRDCLK(CLK3 ^ !CLKPOL3),
|
||||||
.ENBRDEN(|1),
|
.ENBRDEN(|1),
|
||||||
.REGCEBREGCE(|0),
|
.REGCEBREGCE(|0),
|
||||||
.RSTB(|0),
|
.RSTBRST(|0),
|
||||||
.WEBWEU(B1EN_2)
|
.WEBWEU(B1EN_2)
|
||||||
);
|
);
|
||||||
end else begin
|
end else begin
|
||||||
|
@ -248,7 +248,7 @@ module \$__XILINX_RAMB8BWER_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DAT
|
||||||
.CLKBRDCLK(CLK3 ^ !CLKPOL3),
|
.CLKBRDCLK(CLK3 ^ !CLKPOL3),
|
||||||
.ENBRDEN(|1),
|
.ENBRDEN(|1),
|
||||||
.REGCEBREGCE(|0),
|
.REGCEBREGCE(|0),
|
||||||
.RSTB(|0),
|
.RSTBRST(|0),
|
||||||
.WEBWEU(B1EN_2)
|
.WEBWEU(B1EN_2)
|
||||||
);
|
);
|
||||||
end endgenerate
|
end endgenerate
|
||||||
|
|
BIN
tests/various/gzip_verilog.v.gz
Normal file
BIN
tests/various/gzip_verilog.v.gz
Normal file
Binary file not shown.
2
tests/various/gzip_verilog.ys
Normal file
2
tests/various/gzip_verilog.ys
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
read_verilog gzip_verilog.v.gz
|
||||||
|
select -assert-any top
|
Loading…
Add table
Add a link
Reference in a new issue