summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2014-02-16 13:45:47 +0100
committerClifford Wolf <clifford@clifford.at>2014-02-16 13:45:47 +0100
commit9c29969bbc1b19f251011feaa791d242ac8e5e81 (patch)
tree1f994ff181fe527dfc19cf842c79668bddd9d492
parent7ac524e8e8d1745dec4605c32944e318f46daf4e (diff)
Progress in presentation
-rw-r--r--manual/PRESENTATION_ExAdv.tex45
-rw-r--r--manual/PRESENTATION_ExAdv/Makefile5
-rw-r--r--manual/PRESENTATION_ExAdv/red_or3x1_cells.v5
-rw-r--r--manual/PRESENTATION_ExAdv/red_or3x1_map.v48
-rw-r--r--manual/PRESENTATION_ExAdv/red_or3x1_test.v5
-rw-r--r--manual/PRESENTATION_ExAdv/red_or3x1_test.ys7
6 files changed, 114 insertions, 1 deletions
diff --git a/manual/PRESENTATION_ExAdv.tex b/manual/PRESENTATION_ExAdv.tex
index 21c5cdec..3f5743da 100644
--- a/manual/PRESENTATION_ExAdv.tex
+++ b/manual/PRESENTATION_ExAdv.tex
@@ -239,6 +239,51 @@ show -color red @cone_ab -color magenta @cone_a -color blue @cone_b
\subsectionpagesuffix
\end{frame}
+\subsubsection{Introduction to techmap}
+
+\begin{frame}{\subsubsecname}
+\begin{itemize}
+\item
+The {\tt techmap} command replaces cells in the design with implementations given
+as verilog code (called ``map files''). It can replace Yosys' internal cell
+types (such as {\tt \$or}) as well as user-defined cell types.
+\medskip\item
+Verilog parameters are used extensively to customize the internal cell types.
+\medskip\item
+Additional special parameters are used by techmap to communicate meta-data to the
+map files.
+\medskip\item
+Special wires are used to instruct techmap how to handle a module in the map file.
+\medskip\item
+Generate blocks and recursion are powerful tools for writing map files.
+\end{itemize}
+\end{frame}
+
+\begin{frame}[t]{\subsubsecname -- Example 1/2}
+\vskip-0.2cm
+To map the Verilog OR-reduction operator to 3-input OR gates:
+\vskip-0.2cm
+\begin{columns}
+\column[t]{0.35\linewidth}
+\lstinputlisting[xleftmargin=0.5cm, basicstyle=\ttfamily\fontsize{7pt}{8pt}\selectfont, language=verilog, lastline=24]{PRESENTATION_ExAdv/red_or3x1_map.v}
+\column[t]{0.65\linewidth}
+\lstinputlisting[xleftmargin=0.5cm, basicstyle=\ttfamily\fontsize{7pt}{8pt}\selectfont, language=verilog, firstline=25]{PRESENTATION_ExAdv/red_or3x1_map.v}
+\end{columns}
+\end{frame}
+
+\begin{frame}[t]{\subsubsecname -- Example 2/2}
+\vbox to 0cm{
+\hfil\includegraphics[width=10cm,trim=0 0cm 0 0cm]{PRESENTATION_ExAdv/red_or3x1.pdf}
+\vss
+}
+\begin{columns}
+\column[t]{6cm}
+\column[t]{4cm}
+\vskip-0.6cm\lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=ys, firstline=4, lastline=4, frame=single]{PRESENTATION_ExAdv/red_or3x1_test.ys}
+\vskip-0.2cm\lstinputlisting[basicstyle=\ttfamily\fontsize{8pt}{10pt}\selectfont, language=verilog]{PRESENTATION_ExAdv/red_or3x1_test.v}
+\end{columns}
+\end{frame}
+
\subsubsection{TBD}
\begin{frame}{\subsubsecname}
diff --git a/manual/PRESENTATION_ExAdv/Makefile b/manual/PRESENTATION_ExAdv/Makefile
index f38bd6ce..673b3a21 100644
--- a/manual/PRESENTATION_ExAdv/Makefile
+++ b/manual/PRESENTATION_ExAdv/Makefile
@@ -1,6 +1,9 @@
-all: select_01.pdf
+all: select_01.pdf red_or3x1.pdf
select_01.pdf: select_01.v select_01.ys
../../yosys select_01.ys
+red_or3x1.pdf: red_or3x1_*
+ ../../yosys red_or3x1_test.ys
+
diff --git a/manual/PRESENTATION_ExAdv/red_or3x1_cells.v b/manual/PRESENTATION_ExAdv/red_or3x1_cells.v
new file mode 100644
index 00000000..0750a130
--- /dev/null
+++ b/manual/PRESENTATION_ExAdv/red_or3x1_cells.v
@@ -0,0 +1,5 @@
+module OR3X1(A, B, C, Y);
+ input A, B, C;
+ output Y;
+ assign Y = A | B | C;
+endmodule
diff --git a/manual/PRESENTATION_ExAdv/red_or3x1_map.v b/manual/PRESENTATION_ExAdv/red_or3x1_map.v
new file mode 100644
index 00000000..24ca9dab
--- /dev/null
+++ b/manual/PRESENTATION_ExAdv/red_or3x1_map.v
@@ -0,0 +1,48 @@
+module \$reduce_or (A, Y);
+
+ parameter A_SIGNED = 0;
+ parameter A_WIDTH = 0;
+ parameter Y_WIDTH = 0;
+
+ input [A_WIDTH-1:0] A;
+ output [Y_WIDTH-1:0] Y;
+
+ function integer min;
+ input integer a, b;
+ begin
+ if (a < b)
+ min = a;
+ else
+ min = b;
+ end
+ endfunction
+
+ genvar i;
+ generate begin
+ if (A_WIDTH == 0) begin
+ assign Y = 0;
+ end
+ if (A_WIDTH == 1) begin
+ assign Y = A;
+ end
+ if (A_WIDTH == 2) begin
+ wire ybuf;
+ OR3X1 g (.A(A[0]), .B(A[1]), .C(1'b0), .Y(ybuf));
+ assign Y = ybuf;
+ end
+ if (A_WIDTH == 3) begin
+ wire ybuf;
+ OR3X1 g (.A(A[0]), .B(A[1]), .C(A[2]), .Y(ybuf));
+ assign Y = ybuf;
+ end
+ if (A_WIDTH > 3) begin
+ localparam next_stage_sz = (A_WIDTH+2) / 3;
+ wire [next_stage_sz-1:0] next_stage;
+ for (i = 0; i < next_stage_sz; i = i+1) begin
+ localparam bits = min(A_WIDTH - 3*i, 3);
+ assign next_stage[i] = |A[3*i +: bits];
+ end
+ assign Y = |next_stage;
+ end
+ end endgenerate
+endmodule
diff --git a/manual/PRESENTATION_ExAdv/red_or3x1_test.v b/manual/PRESENTATION_ExAdv/red_or3x1_test.v
new file mode 100644
index 00000000..bcdd32cb
--- /dev/null
+++ b/manual/PRESENTATION_ExAdv/red_or3x1_test.v
@@ -0,0 +1,5 @@
+module test (A, Y);
+ input [6:0] A;
+ output Y;
+ assign Y = |A;
+endmodule
diff --git a/manual/PRESENTATION_ExAdv/red_or3x1_test.ys b/manual/PRESENTATION_ExAdv/red_or3x1_test.ys
new file mode 100644
index 00000000..b9234603
--- /dev/null
+++ b/manual/PRESENTATION_ExAdv/red_or3x1_test.ys
@@ -0,0 +1,7 @@
+read_verilog red_or3x1_test.v
+hierarchy -check -top test
+
+techmap -map red_or3x1_map.v;;
+
+splitnets -ports
+show -prefix red_or3x1 -format pdf -notitle -lib red_or3x1_cells.v