{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sympy as sp\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy import signal, optimize\n", "import functools, operator\n", "\n", "%matplotlib inline\n", "\n", "from math import ceil\n", "from migen import *\n", "from migen.fhdl import verilog" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# http://home.mit.bme.hu/~kollar/papers/cic.pdf" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def stream(width):\n", " return Record([\n", " (\"data\", width, DIR_M_TO_S),\n", " (\"stb\", 1, DIR_M_TO_S),\n", " (\"ack\", 1, DIR_M_TO_S),\n", " ])\n", "\n", "\n", "def source(stream, i):\n", " for ti, ii in i:\n", " assert ti > 0\n", " for _ in range(ti - 1):\n", " yield\n", " yield stream.data.eq(ii)\n", " yield stream.stb.eq(1)\n", " yield\n", " while not (yield stream.ack):\n", " #print(ti, \"dly\")\n", " yield\n", " yield stream.stb.eq(0)\n", "\n", "\n", "#@passive\n", "def sink(stream, o, max):\n", " yield stream.ack.eq(1)\n", " t = 0\n", " \n", " while True:\n", " while not (yield stream.stb):\n", " t += 1\n", " yield\n", " d = yield stream.data\n", " o.append((t, d))\n", " if len(o) == max:\n", " break\n", " t = 1\n", " yield\n", " yield stream.ack.eq(0)\n", " \n", "\n", "class Upsampler(Module):\n", " def __init__(self, r, width):\n", " self.i = stream(width)\n", " self.o = stream(width)\n", " self.r = Signal(max=r, reset=r - 1)\n", "\n", " i = Signal(max=r)\n", " i_done = Signal()\n", " self.comb += [\n", " i_done.eq(i == 0),\n", " self.i.ack.eq(i_done & self.o.ack),\n", " If(i_done,\n", " self.o.data.eq(self.i.data),\n", " ),\n", " self.o.stb.eq(~i_done | self.i.stb),\n", " ]\n", " self.sync += [\n", " If(self.o.ack & self.o.stb & ~i_done,\n", " i.eq(i - 1)\n", " ),\n", " If(self.i.ack & self.i.stb,\n", " i.eq(self.r)\n", " ),\n", " ]\n", "\n", "\n", "class Downsampler(Module):\n", " def __init__(self, r, width):\n", " self.i = stream(width)\n", " self.o = stream(width)\n", " self.r = Signal(max=r, reset=r - 1)\n", "\n", " i = Signal(max=r)\n", " i_done = Signal()\n", " self.comb += [\n", " i_done.eq(i == 0),\n", " self.i.ack.eq(~i_done | self.o.ack),\n", " self.o.data.eq(self.i.data),\n", " self.o.stb.eq(i_done & self.i.stb),\n", " ]\n", " self.sync += [\n", " If(self.i.ack & self.i.stb & ~i_done,\n", " i.eq(i - 1)\n", " ),\n", " If(self.o.ack & self.o.stb,\n", " i.eq(self.r)\n", " ),\n", " ]\n", "\n", " \n", "class Register(Module):\n", " def __init__(self, width):\n", " self.i = stream(width)\n", " self.o = stream(width)\n", " self.o.data.reset_less = True\n", "\n", " self.comb += [\n", " self.i.ack.eq(~self.o.stb | self.o.ack),\n", " ]\n", " self.sync += [\n", " If(self.o.ack,\n", " self.o.stb.eq(0),\n", " ),\n", " If(self.i.ack & self.i.stb,\n", " self.o.data.eq(self.i.data),\n", " self.o.stb.eq(1)\n", " )\n", " ]\n", "\n", "\n", "class CIC(Module):\n", " def __init__(self, r, m, n, width):\n", " if isinstance(width, tuple):\n", " width = width[0]\n", " self.gain = (r*m)**n/r\n", " self.rate = Signal(max=abs(r), reset=abs(r) - 1)\n", "\n", " g = -(1 << width - 1)\n", " w = lambda g: (bits_for(ceil(g)), True)\n", " self.i = stream(w(g))\n", " self.o = stream(w(g*self.gain))\n", "\n", " self.i_stall = Signal()\n", " self.o_drop = Signal()\n", "\n", " self.comb += [\n", " self.i_stall.eq(~self.i.ack & self.i.stb)\n", " ]\n", " \n", " x, en = self.i.data, self.i.stb\n", " if r > 0:\n", " i = Signal(max=r)\n", " self.comb += [\n", " self.i.ack.eq(i == 0),\n", " ]\n", " self.sync += [\n", " If(~self.i.ack,\n", " i.eq(i - 1),\n", " ),\n", " If(self.i.stb,\n", " i.eq(self.rate - 1),\n", " ),\n", " ]\n", " if False:\n", " for i in range(n):\n", " g *= 2\n", " x, en = self.make_comb(x, en, w(g), m)\n", " else:\n", " g *= 2**n\n", " x, en = self.make_itercomb(x, en, w(g), n, m)\n", " self.submodules.r = Upsampler(abs(r), w(g))\n", " g *= 1/r\n", " self.comb += [\n", " self.r.r.eq(self.rate),\n", " self.r.i.data.eq(x),\n", " self.r.i.stb.eq(en),\n", " self.r.o.ack.eq(1),\n", " ]\n", " x, en = self.r.o.data, self.r.o.stb\n", " for i in range(n):\n", " g *= r*m/2\n", " x, en = self.make_integrator(x, en, w(g))\n", " else:\n", " self.comb += self.i.ack.eq(1)\n", " g *= (r*m)**n\n", " for i in range(n):\n", " x, en = self.make_integrator(x, en, w(g))\n", " self.submodules.r = Downsampler(abs(r), w(g))\n", " self.comb += [\n", " self.r.r.eq(self.rate),\n", " self.r.i.data.eq(x),\n", " self.r.i.stb.eq(en),\n", " self.r.o.ack.eq(1),\n", " ]\n", " x, en = self.r.o.data, self.r.o.stb\n", " for i in range(n):\n", " x, en = self.make_comb(x, en, w(g), m)\n", " self.o.data.reset_less = True\n", " self.sync += [\n", " self.o.data.eq(x),\n", " self.o.stb.eq(en),\n", " self.o_drop.eq(self.o.stb & ~self.o.ack & en),\n", " ]\n", "\n", " def make_comb(self, i, en, width, m=1):\n", " i0 = i\n", " for _ in range(m):\n", " i1, i0 = i0, Signal.like(i0)\n", " self.sync += [\n", " If(en,\n", " i0.eq(i1),\n", " )\n", " ]\n", " comb = Signal(width, reset_less=True)\n", " comb_en = Signal()\n", " self.sync += [\n", " comb.eq(i - i0),\n", " comb_en.eq(en),\n", " ]\n", " return comb, comb_en\n", "\n", " def make_itercomb(self, i, en, width, n, m=1):\n", " if m != 1:\n", " raise NotImplemented()\n", " mem = Memory(width=width[0], depth=bits_for(n))\n", " memp = mem.get_port(write_capable=True, mode=READ_FIRST)\n", " self.specials += mem, memp\n", " j = Signal(max=n)\n", " i0 = Signal(width, reset_less=True)\n", " comb0 = Signal(width)\n", " comb = Signal(width, reset_less=True)\n", " done = Signal()\n", " self.comb += done.eq(j == n - 1)\n", " self.sync += [\n", " If(~done,\n", " j.eq(j - 1)\n", " ),\n", " If(en,\n", " j.eq(n - 1)\n", " ),\n", " i0.eq(memp.dat_w)\n", " ]\n", " self.comb += [\n", " comb0.eq(i0 - memp.dat_r),\n", " memp.dat_w.eq(Mux(en, i, comb)),\n", " ]\n", " return comb, comb_en\n", "\n", " \n", " def make_integrator(self, i, en, width):\n", " integrator = Signal(width)\n", " integrator_en = Signal()\n", " self.sync += [\n", " If(en,\n", " integrator.eq(integrator + i),\n", " ),\n", " integrator_en.eq(en),\n", " ]\n", " return integrator, integrator_en" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Memory(19, 3).get_port(write_capable=True, mode=READ_FIRST)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(4, 1), (1, 0), (1, 0), (1, 2), (1, 0), (1, 0), (1, 3), (1, 0), (1, 0), (8, 4), (1, 0), (1, 0)]\n" ] } ], "source": [ "r = 3\n", "f = Upsampler(r, 8)\n", "i = [(4, 1), (3, 2), (3, 3), (10, 4)]\n", "o = []\n", "\n", "with Simulator(f, [source(f.i, i), sink(f.o, o, r*len(i))]) as sim:\n", " sim.run()\n", "print(o)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(4, 1), (3, 4), (14, 7)]\n" ] } ], "source": [ "r = 3\n", "f = Downsampler(r, 8)\n", "i = [(4, 1), (1, 2), (1, 3), (1, 4), (1, 5), (3, 6), (10, 7), (1, 8), (1, 9)]\n", "o = []\n", "\n", "with Simulator(f, [source(f.i, i), sink(f.o, o, len(i)//r)]) as sim:\n", " sim.run()\n", "print(o)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(5, 1), (3, 2), (3, 3), (10, 4)]\n" ] } ], "source": [ "f = Register(8)\n", "i = [(4, 1), (3, 2), (3, 3), (10, 4)]\n", "o = []\n", "\n", "with Simulator(f, [source(f.i, i), sink(f.o, o, len(i))]) as sim:\n", " sim.run()\n", "print(o)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1024.0" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2**4*(4*1)**4/4" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(11, 127), (1, 635), (1, 1905), (1, 4445), (1, 8890), (1, 16002), (1, 26670), (1, -23626), (1, 30097), (1, 25269), (1, 12439), (1, 25899), (1, -31004), (1, -25420), (1, -20980), (1, -15652), (1, -7404), (1, 5796), (1, -6788), (1, 6028), (1, 13508), (1, 17684), (1, 20588), (1, 24252), (9, 30708), (1, -23548), (1, 27356), (1, -27540)] 32512.0\n" ] } ], "source": [ "r = 4\n", "f = CIC(r, 1, 5, (8, True))\n", "i = [(r, 127), (r, 127), (r, 127), (r, 127), (r, 0), (r, 0), (3*r, 0)]\n", "o = []\n", "\n", "with Simulator(f, [source(f.i, i), sink(f.o, o, r*len(i))]) as sim:\n", " sim.run()\n", "print(o, f.gain*i[0][1])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VeW99vHvLwOEBEgISRgCIcwIKAIh4CyOqFW0dgBR\nKoqIdehgB1vfU2vt8dQe29NTtVpExAFFrWLR4lxbtdaYMBPGMIWEKZCQQOZkP+8fiZ6UAtnATtYe\n7s915Ur2Wivs+3EltytrNOccIiISXqK8DiAiIoGnchcRCUMqdxGRMKRyFxEJQyp3EZEwpHIXEQlD\nKncRkTCkchcRCUMqdxGRMBTj1RunpKS4zMxMr95eRCQkLV26dJ9zLrW15Twr98zMTPLy8rx6exGR\nkGRm2/1ZTrtlRETCkMpdRCQMqdxFRMKQyl1EJAyp3EVEwlCr5W5m88xsr5mtOcp8M7Pfm1mBma0y\nszGBjykiIsfDny33+cCkY8y/DBjc/DELePzkY4mIyMlo9Tx359xHZpZ5jEUmA8+6puf1fWZmSWbW\nyzm3K0AZRUSCWn2jj7KqOsoq6ymrquNAVT3V9Q1U1/moqW+kpqGRugYfPgfOOcZlJnPukFavQzop\ngbiIKR3Y0eJ1UfO0fyt3M5tF09Y9GRkZAXhrEZG2V1PfyLb9lWzeW0lhaRU7D1Sz80A1xQeq2VVe\nQ3l1vd//lhnMPm9gSJS735xzc4A5AFlZWXoyt4gEFeccRWXVrCkuZ83OctbtOsjmkkPsKK3C16Kx\nEjvF0jupE+lJncjK7EZalzi6xcfSLaEDyfEdSIyPJaFDDHGx0cTFRhEXG02H6CiioqzdxhKIci8G\n+rZ43ad5mohIUKusbWB54QFyt5WydHsZq4vLv9wKj4kyBqV1ZmR6IpNPT2dgagKD0jrTr3sCnTt6\nducWvwUi4WLgDjNbCIwHyrW/XUSCUU19I7nbSvl40z5ytuxnzc4KGn0OMxjWsyuXn9qTEb0TOTU9\nkaE9uxAXG+115BPWarmb2YvA+UCKmRUB9wGxAM65J4AlwOVAAVAFzGirsCIix2vrvko+XL+Xv28s\nIWfrfmrqfXSIjuL0vknMPm8A4zKTGdOvG13jYr2OGlD+nC0ztZX5Drg9YIlERE6Cc478nRW8k7+b\nd/J3s3HPIQAGpCYwZVwG5w1JZfyAZOI7BP+ulZMR3qMTkYixfncFi5YX85dVuygqqybKILt/Mvdd\nOZyLTulB3+R4ryO2K5W7iISsXeXV/HnFTl5fXsz63QeJiTLOGZzCXRcM5sJT0ujeuaPXET2jcheR\nkFLf6OODdXt58fNCPtpUgnMwJiOJX0wewRWn9oroQm9J5S4iIWFHaRUv5e7g5bwd7D1YS8+ucdx5\nwWC+OjqdzJQEr+MFHZW7iAQt5xx528uY+/EW3l27BwMmDk1janYG5w9NJSZaN7Y9GpW7iASd+kYf\nb63ZzVMfb2FlUTlJ8bHcdt5Arp/Qj95JnbyOFxJU7iISNCprG3ghp5Cn/7GVneU1DEhJ4IGrR3Lt\nmPSwP3Ux0PRfS0Q8d6i2gWc+3cbcj7dQVlXPhAHJPHD1SCYOTWvX+7GEE5W7iHjmYE19U6l/spUD\nVfWcPzSV71w4mNEZ3byOFvJU7iLS7iprG5j3yVbmfrKV8up6LhiWxl0XDub0vkleRwsbKncRaTf1\njT5eyt3B797fxL5DtVx0SlOpn9ZHpR5oKncRaXPOOd7J38Ov31nPlpJKxmV2Y870sYzR7pc2o3IX\nkTa1dHsZDy5Zx9LtZQxMTeDJ6VlcdEoaZjpQ2pZU7iLSJvZW1PBfb61n0fJiUrt05MFrTuUbWX10\n4VE7UbmLSEDVN/p45tNt/O79TdQ1+Lh94kC+ff4gEkLg6UXhRP+1RSRg/rl5P/ctXsPGPYc4b0gq\nP79qBP113xdPqNxF5KTtO1TLL95Yy+KVO+nTrRNzbhjLxcN7aL+6h1TuInLCnHMsWl7ML95cS1Vt\nI3ddOJhvnz8wpJ89Gi5U7iJyQorKqrh30Rr+vrGEsf268dC1pzIorYvXsaSZyl1EjovP53jus+08\n9PZ6AO6/agQ3TOine8AEGZW7iPitcH8Vd7+ygtxtZZw7JJUHrxlJn26R9WzSUKFyF5FWOed4Ja+I\n+9/IJyrKePjro7h2TLoOmAYxlbuIHNP+Q7X85LXVvLt2D2cM6M7D3xhFuh6YEfRU7iJyVH9dv4cf\n/WkVFdUN/L8rTuGms/pr33qIULmLyL+pqW/kgTfXsiCnkGE9u7Bg5gSG9tSZMKFE5S4i/2JzySFu\nX7CM9bsPMuvcAdx9yRA6xui89VCjcheRL72+vJifLlpNXGw082eM4/yhaV5HkhOkchcRqusa+fni\nfF7K20F2ZjK/nzqanolxXseSk6ByF4lwBXubdsNs2HOQ2ycO5HsXDdFtecOAyl0kgr21ehd3v7KS\nuNhonrkpm/OGpHodSQLEr/89m9kkM9tgZgVmds8R5iea2RtmttLM8s1sRuCjikigNPoc//3Oem5b\nsIwhPbqw5K5zVOxhptUtdzOLBh4DLgaKgFwzW+ycW9tisduBtc65K80sFdhgZgucc3VtklpETlh5\nVT3feWk5f9tQwpRxfbl/8gidDROG/Nktkw0UOOe2AJjZQmAy0LLcHdDFmq5F7gyUAg0BzioiJ2nD\n7oPMei6PnQeq+c9rRnJddoZuIRCm/Cn3dGBHi9dFwPjDlnkUWAzsBLoA33TO+QKSUEQC4ov96wkd\nY3jxlglkZSZ7HUnaUKAOiV8KrAB6A6cDj5pZ18MXMrNZZpZnZnklJSUBemsRORbnHI/+ddOX+9ff\nvPNsFXsE8Kfci4G+LV73aZ7W0gzgNdekANgKDDv8H3LOzXHOZTnnslJTdfBGpK3VNjRy9ysrefjd\njUw+vTcLZ02gR1edvx4J/NktkwsMNrP+NJX6FOC6w5YpBC4EPjazHsBQYEsgg4rI8SmtrGP2c0v5\nfFsp37toCHddOEj71yNIq+XunGswszuAd4BoYJ5zLt/MZjfPfwJ4AJhvZqsBA37snNvXhrlF5Bg2\nlxzipvm57Cqv4fdTR3PVqN5eR5J25tdFTM65JcCSw6Y90eLrncAlgY0mIifi0837mP3cUmKjo3jx\nlgmM7dfN60jiAV2hKhJGFq/cyd0vryCzewLzbhxH32Q9Ai9SqdxFwsRTn2zlgTfXkt0/mSenZ5HY\nKdbrSOIhlbtIiPP5HA+9vZ4/frSFSSN68rsppxMXqytOI53KXSSE1Tf6+PGfVvHa8mJumNCPn181\ngmg9Bk9QuYuErMraBm5bsIyPNpbwg0uGcPtEneoo/0flLhKCDlTV8a2nc1lTXM5D157KN8dleB1J\ngozKXSTElBys5Yanctiyr5Inrh/LxcN7eB1JgpDKXSSE7DxQzbS5Oewur+HpG8dx1qAUryNJkFK5\ni4SIbfsqmTY3h4qaep6fmc3Yfrr5lxydyl0kBGzYfZDrn8qhodHHi7dMYGR6oteRJMip3EWC3Oqi\ncqbPyyE2OoqXbz2DwT26eB1JQoDKXSSIrSo6wLS5OXSNi+WFW8bTr3uC15EkRKjcRYLUF8WeFB/L\ni7dMoE833SdG/BeoJzGJSACp2OVkqdxFgsyqogNcPzeHxE4qdjlxKneRIPJFsXftFMvCWSp2OXEq\nd5EgsbqoXMUuAaNyFwkC63dXcP1TKnYJHJW7iMe2lBzi+rmf0yk2WvvYJWBU7iIe2lFaxbS5OTjn\neH7meD0WTwJG5S7ikb0VNVz/VA6VtQ08d/N4BqV19jqShBGVu4gHSivrmDY3h30Ha5l/UzbDe3f1\nOpKEGV2hKtLOKmrqmT4vh8LSKubPyGZMRjevI0kY0pa7SDuqqW/k5vm5bNh9kCeuH8sZA7t7HUnC\nlLbcRdpJQ6OPO15YTt72Mh6ZOpqJw9K8jiRhTFvuIu3AOce9i9bw/ro93H/VCL5yWm+vI0mYU7mL\ntIOH393AS3k7uOuCQUw/I9PrOBIBVO4ibezpf2zlsQ83MzW7L9+7eIjXcSRCqNxF2tDilTv5xZtr\nuWR4Dx6YPBIz8zqSRAiVu0gb+WTTPu5+eQXjMpP5/dTRxETr103aj37aRNrA+t0VzH5+KQNTO/Pk\n9CziYqO9jiQRxq9yN7NJZrbBzArM7J6jLHO+ma0ws3wz+3tgY4qEjj0VNcx4OpeEjtE8PWMciZ1i\nvY4kEajV89zNLBp4DLgYKAJyzWyxc25ti2WSgD8Ak5xzhWamE3glIh2qbWDG07lUVNfz8uwz6JXY\nyetIEqH82XLPBgqcc1ucc3XAQmDyYctcB7zmnCsEcM7tDWxMkeDX0OjjzheWsWHPQR6dNoYRvRO9\njiQRzJ9yTwd2tHhd1DytpSFANzP7m5ktNbPpR/qHzGyWmeWZWV5JScmJJRYJQs457lucz4cbSnhg\n8kgmDtUfr+KtQB1QjQHGAlcAlwL/YWb/dkKvc26Ocy7LOZeVmpoaoLcW8d6TH29hQU4ht50/kOvG\nZ3gdR8Sve8sUA31bvO7TPK2lImC/c64SqDSzj4BRwMaApBQJYktW7+LBJev5ymm9+OElQ72OIwL4\nt+WeCww2s/5m1gGYAiw+bJk/A2ebWYyZxQPjgXWBjSoSfFYXlfP9l1cwtl83Hv76KKKidJGSBIdW\nt9ydcw1mdgfwDhANzHPO5ZvZ7Ob5Tzjn1pnZ28AqwAfMdc6tacvgIl7bU1HDzGdz6Z7QkT/eMFbn\nsktQ8euWv865JcCSw6Y9cdjr/wb+O3DRRIJXTX0js57N42BNA6/ediYpnTt6HUnkX+h+7iLHyTnH\nD/+0ilXF5cy5IYtTeukReRJ8dPsBkeP06F8LeGPlTn506TAuHt7D6zgiR6RyFzkOb63exW/e28hX\nR6cz+7wBXscROSqVu4if1hSX8/2XVzI6I4kHv3qqbt8rQU3lLuKH0so6bn1uKUnxsTozRkKCDqiK\ntKKh0cddLy6n5FAtf5p9Bmld4ryOJNIqbbmLtOLhdzfyScE+fnn1SE7rk+R1HBG/qNxFjuGt1bt4\n4u+bmTY+g29k9W39G0SChMpd5Cg27TnID15pOoD6syuHex1H5Lio3EWOoKKmnlufW0qnDtE8Pm0s\nHWN0AFVCiw6oihzG53Pc/fJKCkurWDBzPD0TdQBVQo+23EUO84e/FfDe2j3ce8UpjB/Q3es4IidE\n5S7Swt827OU3723k6tN7c+OZmV7HETlhKneRZoX7q/jOwhUM69mV//rqaboCVUKayl0EqK5r5Nbn\nl+Kc44/Xj6VTBx1AldCmA6oS8Zxz/HTRatbvruDpG8eR0T3e60giJ01b7hLxnv7HNhYtL+b7Fw3h\n/KFpXscRCQiVu0S0f27ez38uWcclw3tw+8RBXscRCRiVu0Ss4gPV3PHCMjK7x/Obb+jh1hJeVO4S\nkWrqG5n93FLqGnzMmZ5Fl7hYryOJBJQOqErE+eIA6uricuZOz2JgamevI4kEnLbcJeI8+8/tvLas\nmO9eNJiL9AxUCVMqd4koOVv288Cba7nolDTuumCw13FE2ozKXSJG8YFqbn9hGRnJ8fz2m6frAKqE\nNZW7RISqugZueSaP2nofc6aPpasOoEqY0wFVCXs+n+N7L61g/e4K5t04jkFpXbyOJNLmtOUuYe+3\n723knfw93HvFcF2BKhFD5S5h7c8rinn0wwKmjOvLTWdleh1HpN2o3CVsrdhxgB/+aRXj+yfzi8kj\ndQtfiSgqdwlLu8qrueXZPHp2jePx68fSIUY/6hJZ/PqJN7NJZrbBzArM7J5jLDfOzBrM7GuBiyhy\nfKrqGrjl2Tyq6xqZ+60skhM6eB1JpN21Wu5mFg08BlwGDAemmtnwoyz3EPBuoEOK+KvR57jrxeWs\n3VnBI1NHM6SHzoyRyOTPlns2UOCc2+KcqwMWApOPsNydwKvA3gDmE/Gbc45fvJHP++v2cv9VI5g4\nTGfGSOTyp9zTgR0tXhc1T/uSmaUD1wCPBy6ayPGZ949tPPPP7cw6dwA3nJHpdRwRTwXqKNPvgB87\n53zHWsjMZplZnpnllZSUBOitReDtNbv45V/WctnIntwzaZjXcUQ8588VqsVA3xav+zRPaykLWNh8\nqlkKcLmZNTjnXm+5kHNuDjAHICsry51oaJGWlheW8Z2FKzi9bxL/o3vGiAD+lXsuMNjM+tNU6lOA\n61ou4Jzr/8XXZjYfePPwYhdpC4X7q5j5TB49usYxd3oWcbHRXkcSCQqtlrtzrsHM7gDeAaKBec65\nfDOb3Tz/iTbOKHJEpZV13Dj/cxqdY/6McXTv3NHrSCJBw68bhznnlgBLDpt2xFJ3zt148rFEjq2q\nroGb5udSVFbN8zePZ4CepiTyL3TZnoSc+kYf316wjFVFB3hk6miy+yd7HUkk6OiWvxJSfD7Hj/60\nir9tKOFXXz2VS0f09DqSSFDSlruElP96ax2Llhfzg0uGMCU7w+s4IkFL5S4hY85Hm3ny461864x+\n3D5xkNdxRIKayl1CwqtLi3hwyXquOK0XP7tyhG7fK9IKlbsEvXfzd/OjV1dx1qDu/PYbo4jWRUoi\nrVK5S1D7eFMJd7ywnFPTE/njDVl0jNFFSiL+ULlL0Pp8aym3PJvHwLTOPDMjm84ddXKXiL9U7hKU\nVhUd4Kb5ufRO6sRzN2eTGB/rdSSRkKJyl6CzYfdBps/7nKT4WBbMHE+KbisgctxU7hJUtu6rZNrc\nHDrGRPHCzAn0SuzkdSSRkKSdmBI0CvdXMe3Jz/A5x8KZE8joHu91JJGQpS13CQqF+6uY+uRnVNU3\n8tzN2QxK07NPRU6Gyl0890WxV9Y18PzN4xnRO9HrSCIhT+UuntpR+q/FPjJdxS4SCCp38cyO0iqm\nzPmMQ7UqdpFAU7mLJ1oW+4KZKnaRQFO5S7vbtq9SxS7SxnQqpLSrDbsPcv1TOTT6nIpdpA2p3KXd\nrCo6wPR5n9MhOoqXZk1gcA+d7ijSVlTu0i5yt5Uy4+lckuJjeUEXKIm0OZW7tLmPN5Vwy7N59E7q\nxIKZ43VLAZF2oHKXNvVu/m7ueGE5A1ITeF43ARNpNyp3aTMv5Rby00VrGJmeyDMzxpEU38HrSCIR\nQ+UuAeec49G/FvCb9zZy7pBUHp82hgQ9aEOkXek3TgKq0ee4b/Eanv+skK+OTuehr51GbLQupxBp\nbyp3CZia+ka+u3AFb+fv5tbzBnDPpGGY6WHWIl5QuUtAlFfXc8uzeXy+tZT/+Mpwbj67v9eRRCKa\nyl1O2o7SKm5+Jpet+yr5/dTRXDWqt9eRRCKeyl1OyrLCMmY9m0dtg49nZmRz5qAUryOJCCp3OQlv\nrNzJ3a+spGfXOBbOGsegtM5eRxKRZn6dxmBmk8xsg5kVmNk9R5g/zcxWmdlqM/vUzEYFPqoEC+cc\nj3ywiTtfXM6oPom8fvtZKnaRINPqlruZRQOPARcDRUCumS12zq1tsdhW4DznXJmZXQbMAca3RWDx\nVm1DIz95dTWvLS/mmtHp/OraU+kYE+11LBE5jD+7ZbKBAufcFgAzWwhMBr4sd+fcpy2W/wzoE8iQ\nEhz2Hqzh288vI297Gd+/eAh3XjBIpzqKBCl/yj0d2NHidRHH3iq/GXjrSDPMbBYwCyAjI8PPiBIM\nlheWMfv5pZRX1/PI1NFcqTNiRIJaQA+omtlEmsr97CPNd87NoWmXDVlZWS6Q7y1t56XcQv7j9XzS\nunbktdvOYnjvrl5HEpFW+FPuxUDfFq/7NE/7F2Z2GjAXuMw5tz8w8cRLdQ0+7n8jnwU5hZwzOIXf\nTxlNtwTd/EskFPhT7rnAYDPrT1OpTwGua7mAmWUArwE3OOc2BjyltLu9FTXctmAZS7eXcet5A/jh\nJUOJ0T1iREJGq+XunGswszuAd4BoYJ5zLt/MZjfPfwL4GdAd+EPzAbYG51xW28WWtvTp5n18Z+EK\nDtU0aP+6SIgy57zZ9Z2VleXy8vI8eW85skZf0616//eDjWSmJPCHaWMY1lP710WCiZkt9WfjWVeo\nCtB0muN3F67g0837uWZ0Or+8eqTuwS4SwvTbK3xasI+7Fq7gUG09v772NL6e1Ufnr4uEOJV7BKtv\n9PHIB5t45MMCBqZ2ZsHM8Qzt2cXrWCISACr3CLWl5BDfe2kFK4vKuXZMHx64egTxHfTjIBIu9Nsc\nYZxzPJ9TyH/+ZS1xsdE8dt0Yrjitl9exRCTAVO4RZG9FDT96dRV/21DCOYNTePjro+jRNc7rWCLS\nBlTuEeKt1bv46aLVVNU1cv9VI5h+Rj8dNBUJYyr3MLe3ooaf/Tmft/N3c2p6Iv/zzVEMStNBU5Fw\np3IPU845XllaxC/fXEtNg48fTxrGzHP6E6tbCIhEBJV7GCrcX8VPF63mk4J9ZGcm86trT2VAqp6U\nJBJJVO5hpL7Rx/x/bOO3720kOsr45dUjuS47g6go7VsXiTQq9zDx6eZ93PfnfDbtPcSFw9J44OqR\n9E7q5HUsEfGIyj3E7Sqv5pd/WcdfVu2ib3In5k7P4sJT0nQmjEiEU7mHqLoGH3M/2cIjHxTgc47v\nXjSY2ecNJC5WD6sWEZV7yHHOsWT1bn79znq276/iolN6cN+Vw+mbHO91NBEJIir3EJKzZT8PvrWe\nlTsOMLRHF+bPGMf5Q9O8jiUiQUjlHgIK9h7kV29t4P11e+jZNY5ff+00rh3Th2idBSMiR6FyD2Lb\n91fy6F8LeHVZEQkdYvjRpKHMOLM/nTpov7qIHJvKPQht3ddU6q+vKCYmyrjxzP7cccEgkhM6eB1N\nREKEyj2IbC45xGPNpd4hJoobz8zk1nMHkKY7N4rIcVK5B4HlhWXM/WQrb63eRceYaG4+uz+zzh1I\napeOXkcTkRClcvdIo8/xbv5u5n6ylaXby+gSF8Oscwcy85z+pHRWqYvIyVG5t7ODNfW8klfE059u\nZUdpNRnJ8fz8yuF8LasvnTtqdYhIYKhN2oFzjlVF5byQU8jilTuprm9kXGY37r18OBcP76FTGkUk\n4FTubai8up7FK3fyYk4ha3dV0Ck2mqtG9ea68RmM6pvkdTwRCWMq9wCrbWjkw/UlvL68mL+u30td\no49TenXlgatHcvXpvekSF+t1RBGJACr3AKhr8PHPLft5e80u/rJqFxU1DaR07sj1E/pxzeh0RqZ3\n1V0aRaRdqdxPUFVdAx9tLOHtNbv5YP1eDtY0EN8hmktH9OTq0emcNbA7MXqknYh4ROXuJ+ccG/Yc\n5KONJXy0cR+fbyulrsFHUnwsk0b05NIRPTl7cIpuuSsiQUHlfhTOOTaXVJK7rZTcraX8Y/M+9lTU\nAjA4rTPTJ/TjgmFpZPdP1ha6iAQdv8rdzCYB/wtEA3Odc786bL41z78cqAJudM4tC3DWNlVaWcea\n4nLW7CxnReEB8raXUVpZB0BK5w6M79+dc4ekcM7gVD2+TkSCXqvlbmbRwGPAxUARkGtmi51za1ss\ndhkwuPljPPB48+egc7Cmni0llWwuOcTmkkNs2nOI/J0VFB+o/nKZft3jmTg0jez+3RiXmUz/lAQd\nEBWRkOLPlns2UOCc2wJgZguByUDLcp8MPOucc8BnZpZkZr2cc7sCnvgoauobOVBVT1lVHWWVdZRV\n1bOnooadB6rZVV5D8YFqig9UU3Kw9svviYky+nWPZ0y/bnzrzH6M7J3IiN6JJMbrdEURCW3+lHs6\nsKPF6yL+fav8SMukAwEv9w837OWBN9dSW++jtqGRmnofNfWNNPjcEZePi42id1Ineid2YuLQVDJT\nEhiY2pmBqZ3p1z2eWO0vF5Ew1K4HVM1sFjALICMj44T+jcROsZzSsysdY6OIi40mLiaauNgoEjrG\n0C2+A93iY0mK70ByQgdSOjd91i4VEYk0/pR7MdC3xes+zdOOdxmcc3OAOQBZWVlH3tRuxZiMboyZ\n1u1EvlVEJGL4s08iFxhsZv3NrAMwBVh82DKLgenWZAJQ3p7720VE5F+1uuXunGswszuAd2g6FXKe\ncy7fzGY3z38CWELTaZAFNJ0KOaPtIouISGv82ufunFtCU4G3nPZEi68dcHtgo4mIyInSqSIiImFI\n5S4iEoZU7iIiYUjlLiIShlTuIiJhyJpOdPHgjc1KgO0n+O0pwL4Axgl2Gm/4iqSxgsYbCP2cc6mt\nLeRZuZ8MM8tzzmV5naO9aLzhK5LGChpve9JuGRGRMKRyFxEJQ6Fa7nO8DtDONN7wFUljBY233YTk\nPncRETm2UN1yFxGRYwi5cjezSWa2wcwKzOwer/O0BTPbZmarzWyFmeU1T0s2s/fMbFPz55C8qb2Z\nzTOzvWa2psW0o47NzH7SvK43mNml3qQ+cUcZ78/NrLh5/a4ws8tbzAvZ8ZpZXzP70MzWmlm+mX2n\neXpYrt9jjDc41q9zLmQ+aLrl8GZgANABWAkM9zpXG4xzG5By2LRfA/c0f30P8JDXOU9wbOcCY4A1\nrY0NGN68jjsC/ZvXfbTXYwjAeH8O/OAIy4b0eIFewJjmr7sAG5vHFJbr9xjjDYr1G2pb7l8+rNs5\nVwd88bDuSDAZeKb562eAqz3McsKccx8BpYdNPtrYJgMLnXO1zrmtND0vILtdggbIUcZ7NCE9Xufc\nLufcsuavDwLraHqWcliu32OM92jadbyhVu5HexB3uHHA+2a2tPm5swA93P893Wo30MObaG3iaGML\n5/V9p5mtat5t88VuirAZr5llAqOBHCJg/R42XgiC9Rtq5R4pznbOnQ5cBtxuZue2nOma/sYLy9Oc\nwnlsLTxO067F04FdwG+8jRNYZtYZeBX4rnOuouW8cFy/RxhvUKzfUCt3vx7EHeqcc8XNn/cCi2j6\n022PmfUCaP6817uEAXe0sYXl+nbO7XHONTrnfMCT/N+f5iE/XjOLpanoFjjnXmueHLbr90jjDZb1\nG2rl7s/DukOamSWYWZcvvgYuAdbQNM5vNS/2LeDP3iRsE0cb22Jgipl1NLP+wGDgcw/yBdQXRdfs\nGprWL4T4eM3MgKeAdc6537aYFZbr92jjDZr16/UR5xM4Qn05TUelNwP3ep2nDcY3gKYj6iuB/C/G\nCHQHPgD/uXc9AAAAf0lEQVQ2Ae8DyV5nPcHxvUjTn6r1NO1zvPlYYwPubV7XG4DLvM4foPE+B6wG\nVtH0C98rHMYLnE3TLpdVwIrmj8vDdf0eY7xBsX51haqISBgKtd0yIiLiB5W7iEgYUrmLiIQhlbuI\nSBhSuYuIhCGVu4hIGFK5i4iEIZW7iEgY+v+YCCWkYh6yJgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "r = 128\n", "f = CIC(r, 1, 3, (16, True))\n", "i = [(r, 1)]*2 #+ [(r, 0)]*r\n", "o = []\n", "with Simulator(f, [source(f.i, i), sink(f.o, o, r*len(i))]) as sim:\n", " sim.run()\n", "o = np.array([_[1] for _ in o])/f.gain\n", "plt.plot(o)\n", "#plt.psd(o);" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/* Machine-generated using Migen */\n", "module top(\n", "\tinput signed [7:0] data,\n", "\tinput stb,\n", "\toutput ack,\n", "\toutput reg signed [34:0] data_1,\n", "\toutput reg stb_1,\n", "\tinput ack_1,\n", "\toutput i_stall,\n", "\toutput reg o_drop,\n", "\tinput sys_clk,\n", "\tinput sys_rst\n", ");\n", "\n", "reg [8:0] rate = 9'd511;\n", "reg [8:0] i0 = 9'd0;\n", "reg signed [7:0] cic0 = 8'sd0;\n", "reg signed [8:0] cic_comb0 = 9'sd0;\n", "reg cic_comb_en0 = 1'd0;\n", "reg signed [8:0] cic1 = 9'sd0;\n", "reg signed [9:0] cic_comb1 = 10'sd0;\n", "reg cic_comb_en1 = 1'd0;\n", "reg signed [9:0] cic2 = 10'sd0;\n", "reg signed [10:0] cic_comb2 = 11'sd0;\n", "reg cic_comb_en2 = 1'd0;\n", "reg signed [10:0] cic3 = 11'sd0;\n", "reg signed [11:0] cic_comb3 = 12'sd0;\n", "reg cic_comb_en3 = 1'd0;\n", "wire signed [11:0] i_data1;\n", "wire i_stb1;\n", "wire i_ack1;\n", "reg signed [11:0] o_data1;\n", "wire o_stb1;\n", "wire o_ack1;\n", "wire [8:0] r;\n", "reg [8:0] i1 = 9'd0;\n", "wire i_done;\n", "reg signed [10:0] cic_integrator0 = 11'sd0;\n", "reg cic_integrator_en0 = 1'd0;\n", "reg signed [18:0] cic_integrator1 = 19'sd0;\n", "reg cic_integrator_en1 = 1'd0;\n", "reg signed [26:0] cic_integrator2 = 27'sd0;\n", "reg cic_integrator_en2 = 1'd0;\n", "reg signed [34:0] cic_integrator3 = 35'sd0;\n", "reg cic_integrator_en3 = 1'd0;\n", "\n", "// synthesis translate_off\n", "reg dummy_s;\n", "initial dummy_s <= 1'd0;\n", "// synthesis translate_on\n", "\n", "assign i_stall = ((~ack) & stb);\n", "assign ack = (i0 == 1'd0);\n", "assign r = rate;\n", "assign i_data1 = cic_comb3;\n", "assign i_stb1 = cic_comb_en3;\n", "assign o_ack1 = 1'd1;\n", "assign i_done = (i1 == 1'd0);\n", "assign i_ack1 = (i_done & o_ack1);\n", "\n", "// synthesis translate_off\n", "reg dummy_d;\n", "// synthesis translate_on\n", "always @(*) begin\n", "\to_data1 <= 12'sd0;\n", "\tif (i_done) begin\n", "\t\to_data1 <= i_data1;\n", "\tend\n", "// synthesis translate_off\n", "\tdummy_d <= dummy_s;\n", "// synthesis translate_on\n", "end\n", "assign o_stb1 = ((~i_done) | i_stb1);\n", "\n", "always @(posedge sys_clk) begin\n", "\tif ((~ack)) begin\n", "\t\ti0 <= (i0 - 1'd1);\n", "\tend\n", "\tif (stb) begin\n", "\t\ti0 <= (rate - 1'd1);\n", "\tend\n", "\tif (stb) begin\n", "\t\tcic0 <= data;\n", "\tend\n", "\tcic_comb0 <= (data - cic0);\n", "\tcic_comb_en0 <= stb;\n", "\tif (cic_comb_en0) begin\n", "\t\tcic1 <= cic_comb0;\n", "\tend\n", "\tcic_comb1 <= (cic_comb0 - cic1);\n", "\tcic_comb_en1 <= cic_comb_en0;\n", "\tif (cic_comb_en1) begin\n", "\t\tcic2 <= cic_comb1;\n", "\tend\n", "\tcic_comb2 <= (cic_comb1 - cic2);\n", "\tcic_comb_en2 <= cic_comb_en1;\n", "\tif (cic_comb_en2) begin\n", "\t\tcic3 <= cic_comb2;\n", "\tend\n", "\tcic_comb3 <= (cic_comb2 - cic3);\n", "\tcic_comb_en3 <= cic_comb_en2;\n", "\tif (o_stb1) begin\n", "\t\tcic_integrator0 <= (cic_integrator0 + o_data1);\n", "\tend\n", "\tcic_integrator_en0 <= o_stb1;\n", "\tif (cic_integrator_en0) begin\n", "\t\tcic_integrator1 <= (cic_integrator1 + cic_integrator0);\n", "\tend\n", "\tcic_integrator_en1 <= cic_integrator_en0;\n", "\tif (cic_integrator_en1) begin\n", "\t\tcic_integrator2 <= (cic_integrator2 + cic_integrator1);\n", "\tend\n", "\tcic_integrator_en2 <= cic_integrator_en1;\n", "\tif (cic_integrator_en2) begin\n", "\t\tcic_integrator3 <= (cic_integrator3 + cic_integrator2);\n", "\tend\n", "\tcic_integrator_en3 <= cic_integrator_en2;\n", "\tdata_1 <= cic_integrator3;\n", "\tstb_1 <= cic_integrator_en3;\n", "\to_drop <= ((stb_1 & (~ack_1)) & cic_integrator_en3);\n", "\tif (((o_ack1 & o_stb1) & (~i_done))) begin\n", "\t\ti1 <= (i1 - 1'd1);\n", "\tend\n", "\tif ((i_ack1 & i_stb1)) begin\n", "\t\ti1 <= r;\n", "\tend\n", "\tif (sys_rst) begin\n", "\t\tstb_1 <= 1'd0;\n", "\t\to_drop <= 1'd0;\n", "\t\ti0 <= 9'd0;\n", "\t\tcic0 <= 8'sd0;\n", "\t\tcic_comb_en0 <= 1'd0;\n", "\t\tcic_comb_en1 <= 1'd0;\n", "\t\tcic_comb_en2 <= 1'd0;\n", "\t\tcic_comb_en3 <= 1'd0;\n", "\t\ti1 <= 9'd0;\n", "\t\tcic_integrator0 <= 11'sd0;\n", "\t\tcic_integrator_en0 <= 1'd0;\n", "\t\tcic_integrator1 <= 19'sd0;\n", "\t\tcic_integrator_en1 <= 1'd0;\n", "\t\tcic_integrator2 <= 27'sd0;\n", "\t\tcic_integrator_en2 <= 1'd0;\n", "\t\tcic_integrator3 <= 35'sd0;\n", "\t\tcic_integrator_en3 <= 1'd0;\n", "\tend\n", "end\n", "\n", "endmodule\n", "\n", "\n" ] } ], "source": [ "f = CIC(512, 1, 4, 8)\n", "print(verilog.convert(f, ios={f.i.ack, f.i.stb, f.i.data, f.i_stall, f.o.ack, f.o.stb, f.o.data, f.o_drop}))" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAWFnLA0FV1bFAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "r = 8\n", "\n", "x = np.array([0, 1., -.66, 2, .3, 1] + [0]*4)\n", "x = x.repeat(1)\n", "dt = np.ones(len(x), np.int32)*r\n", "t = dt.cumsum()\n", "\n", "# r = 1 << bits_for(int(max(dt)))\n", "f = CIC(r, 1, 3, (16, True))\n", "i = [(int(dti), int(xi*(1 << 12))) for dti, xi in zip(dt, x)]\n", "o = []\n", "\n", "def rate_setter(dut, dt, dly=1):\n", " for i in range(dly):\n", " yield\n", " for dti in dt[1:]:\n", " for i in range(dti):\n", " yield\n", " yield dut.rate.eq(int(dti - 1))\n", "\n", "# rate_setter(f, dt), \n", "try:\n", " with Simulator(f, [source(f.i, i), passive(sink)(f.o, o, None)]) as sim:\n", " sim.run()\n", "except KeyboardInterrupt:\n", " pass\n", "ot, ox = np.array(o).T\n", "ot = ot.cumsum() - 18\n", "ox = ox/f.gain/(1 << 12)\n", "\n", "fig, ax = plt.subplots()\n", "ax.plot(t, x)\n", "ax.plot(ot, ox, \"o-\")\n", "\n", "from artiq.wavesynth import coefficients\n", "ms = coefficients.UnivariateMultiSpline(t, x[None, :], order=3)\n", "st = np.arange((len(t) - 1)*r) + r\n", "sx = ms(st)[0, 0]\n", "ax.plot(st, sx)" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "n = 1 << 10\n", "ax.set_xscale(\"log\")\n", "ax.psd(ox, NFFT=n)\n", "ax.psd(sx, NFFT=n);" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(ot, np.ediff1d(np.ediff1d(ox, to_begin=0), to_begin=0))\n", "plt.plot(st, np.ediff1d(np.ediff1d(sx, to_begin=0), to_begin=0))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:py35]", "language": "python", "name": "conda-env-py35-py" }, "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.5.3" } }, "nbformat": 4, "nbformat_minor": 2 }