{ "cells": [ { "cell_type": "markdown", "id": "19c772f9-beba-4d58-99da-43e2abef2096", "metadata": {}, "source": [ "# Direct translation to RTL\n", "\n", "The primitive example below demonstrates how to directly synthesize from a cyHDL notation to yosys RTL and display using the .dot backend." ] }, { "cell_type": "code", "execution_count": 1, "id": "594bb478-6c09-41cb-a6aa-ecaf997aa277", "metadata": {}, "outputs": [], "source": [ "from cyhdl import *" ] }, { "cell_type": "code", "execution_count": 2, "id": "701a8949-98b8-49ae-bae2-7b651da76ff7", "metadata": {}, "outputs": [], "source": [ "@block\n", "def unitx(clk : ClkSignal, a : Signal, b : Signal.Output):\n", " @always(clk.posedge)\n", " def worker():\n", " if a < 20:\n", " b.next = concat(a[3:], a[4:])\n", " if a > 6:\n", " b.next = 0\n", " elif a < 4:\n", " b.next = 44\n", " \n", " return instances()" ] }, { "cell_type": "code", "execution_count": 3, "id": "4ebe268a-a029-4741-88b7-1438df761f70", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32m Adding module with name `unitx` \u001b[0m\n", "\u001b[7;34m FINALIZE implementation `unitx` of `unitx` \u001b[0m\n" ] } ], "source": [ "from myirl.targets import pyosys\n", "\n", "def test():\n", " \n", " clk = ClkSignal()\n", " a, b = [ Signal(intbv()[7:]) for _ in range(2) ]\n", " u = unitx(clk, a, b)\n", "\n", " r = pyosys.RTLIL(\"top1\")\n", " d = u.elab(r)\n", " d[0].run(\"opt\")\n", " d[0].display_rtl(fmt=\"dot\")\n", " return d[0]\n", "design = test()" ] }, { "cell_type": "code", "execution_count": 4, "id": "541a925e-6831-4332-8035-6ba424764195", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " \n", " \n", " \n", "\n", "unitx\n", "\n", "unitx\n", "\n", "\n", "n8\n", "\n", "a\n", "\n", "\n", "\n", "x0\n", "\n", "2:0 - 6:4\n", "\n", "3:0 - 3:0\n", "\n", "\n", "\n", "n8:e->x0:w\n", "\n", "\n", "\n", "\n", "\n", "n8:e->x0:w\n", "\n", "\n", "\n", "\n", "\n", "c24\n", "\n", "A\n", "\n", "B\n", "\n", "$worker:10::4da5/gt:_u\n", "$gt\n", "\n", "Y\n", "\n", "\n", "\n", "n8:e->c24:w\n", "\n", "\n", "\n", "\n", "\n", "c25\n", "\n", "A\n", "\n", "B\n", "\n", "$worker:8::4021/gt:_u\n", "$gt\n", "\n", "Y\n", "\n", "\n", "\n", "n8:e->c25:w\n", "\n", "\n", "\n", "\n", "\n", "c26\n", "\n", "A\n", "\n", "B\n", "\n", "$worker:8::9558/gt:_u\n", "$gt\n", "\n", "Y\n", "\n", "\n", "\n", "n8:e->c26:w\n", "\n", "\n", "\n", "\n", "\n", "n9\n", "\n", "b\n", "\n", "\n", "\n", "n10\n", "\n", "clk\n", "\n", "\n", "\n", "c22\n", "\n", "CLK\n", "\n", "D\n", "\n", "EN\n", "\n", "$11\n", "$dffe\n", "\n", "Q\n", "\n", "\n", "\n", "n10:e->c22:w\n", "\n", "\n", "\n", "\n", "\n", "v1\n", "\n", "7'0000000\n", "\n", "\n", "\n", "c15\n", "\n", "A\n", "\n", "B\n", "\n", "S\n", "\n", "$Mux_0\n", "$mux\n", "\n", "Y\n", "\n", "\n", "\n", "v1:e->c15:w\n", "\n", "\n", "\n", "\n", "\n", "c17\n", "\n", "A\n", "\n", "B\n", "\n", "S\n", "\n", "$Mux_2\n", "$mux\n", "\n", "Y\n", "\n", "\n", "\n", "c15:e->c17:w\n", "\n", "\n", "\n", "\n", "\n", "x0:e->c15:w\n", "\n", "\n", "\n", "\n", "\n", "\n", "v2\n", "\n", "7'x\n", "\n", "\n", "\n", "c16\n", "\n", "A\n", "\n", "B\n", "\n", "S\n", "\n", "$Mux_1\n", "$mux\n", "\n", "Y\n", "\n", "\n", "\n", "v2:e->c16:w\n", "\n", "\n", "\n", "\n", "\n", "v3\n", "\n", "7'0101100\n", "\n", "\n", "\n", "v3:e->c16:w\n", "\n", "\n", "\n", "\n", "\n", "c16:e->c17:w\n", "\n", "\n", "\n", "\n", "\n", "c17:e->c22:w\n", "\n", "\n", "\n", "\n", "\n", "c22:e->n9:w\n", "\n", "\n", "\n", "\n", "\n", "c23\n", "\n", "A\n", "\n", "$13\n", "$reduce_bool\n", "\n", "Y\n", "\n", "\n", "\n", "c23:e->c22:w\n", "\n", "\n", "\n", "\n", "\n", "x4\n", "\n", "0:0 - 1:1\n", "\n", "0:0 - 0:0\n", "\n", "\n", "\n", "x4:e->c23:w\n", "\n", "\n", "\n", "\n", "\n", "\n", "v5\n", "\n", "7'0000100\n", "\n", "\n", "\n", "v5:e->c24:w\n", "\n", "\n", "\n", "\n", "\n", "n3\n", "\n", "\n", "\n", "\n", "c24:e->n3:w\n", "\n", "\n", "\n", "\n", "\n", "v6\n", "\n", "7'0010100\n", "\n", "\n", "\n", "v6:e->c25:w\n", "\n", "\n", "\n", "\n", "\n", "n6\n", "\n", "\n", "\n", "\n", "c25:e->n6:w\n", "\n", "\n", "\n", "\n", "\n", "v7\n", "\n", "7'0000110\n", "\n", "\n", "\n", "v7:e->c26:w\n", "\n", "\n", "\n", "\n", "\n", "c26:e->c15:w\n", "\n", "\n", "\n", "\n", "\n", "n3:e->c16:w\n", "\n", "\n", "\n", "\n", "\n", "n3:e->x4:w\n", "\n", "\n", "\n", "\n", "\n", "n6:e->c17:w\n", "\n", "\n", "\n", "\n", "\n", "n6:e->x4:w\n", "\n", "\n", "\n", "\n", "\n", "\\n\n", "\n", "\n", "\n", "\n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from yosys import display\n", "display.display_dot(design.name)" ] }, { "cell_type": "code", "execution_count": null, "id": "38b7bf74-7971-4bbe-b6a8-4c8ad229b345", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.0" } }, "nbformat": 4, "nbformat_minor": 5 }