{ "info": { "author": "Ben Reynwar", "author_email": "ben@reynwar.net", "bugtrack_url": null, "classifiers": [], "description": "\nslvcodec\n========\n\nslvcodec is a tool that analyzes VHDL and generates:\n\n * Functions to convert arbitrary VHDL types to and from std_logic_vector.\n\n * Generate testbenches for entities that read inputs from a file, and\n write outputs to a file.\n\n * Utilities so that unit tests for VHDL code can easily to be written\n in python.\n\n\nGeneration of functions to convert to and from std_logic_vector\n---------------------------------------------------------------\n\nHere's an example VHDL package.\n\n.. code:: vhdl\n\n library ieee;\n use ieee.numeric_std.all;\n\n package complex is\n\n constant FIXED_WIDTH: natural := 8;\n subtype fixed_t is unsigned(FIXED_WIDTH-1 downto 0);\n\n type complex_t is record\n real: fixed_t;\n imag: fixed_t;\n end record;\n\n type array_of_complex is array(natural range <>) of complex_t;\n\n end package;\n\nThe following python script is used to generate a helper package that contains\nfunctions to convert the types to and from std_logic_vector.\n\n.. code:: python\n\n import os\n\n from slvcodec import filetestbench_generator\n\n\n thisdir = os.path.dirname(__file__)\n\n\n def make_slvcodec_package():\n complex_pkg_fn = os.path.join(thisdir, 'complex_pkg.vhd')\n directory = os.path.join(thisdir, 'generated')\n os.mkdir(directory)\n filetestbench_generator.add_slvcodec_files(directory, [complex_pkg_fn])\n\n\n if __name__ == '__main__':\n make_slvcodec_package()\n\nHere is what the generated VHDL looks like.\n\n.. code:: vhdl\n\n library ieee;\n use ieee.std_logic_1164.all;\n use ieee.numeric_std.all;\n use work.complex.all;\n use work.slvcodec.all;\n\n package complex_slvcodec is\n\n\n function to_slvcodec (constant data: array_of_complex) return std_logic_vector;\n function from_slvcodec (constant slv: std_logic_vector) return array_of_complex;\n constant fixed_t_slvcodecwidth: natural := fixed_width;\n constant complex_t_slvcodecwidth: natural := 2*fixed_width;\n function to_slvcodec (constant data: complex_t) return std_logic_vector;\n function from_slvcodec (constant slv: std_logic_vector) return complex_t;\n\n end package;\n\n package body complex_slvcodec is\n\n function to_slvcodec (constant data: array_of_complex) return std_logic_vector is\n constant W: natural := complex_t_slvcodecwidth;\n constant N: natural := data'length;\n variable slv: std_logic_vector(N*W-1 downto 0);\n begin\n for ii in 0 to N-1 loop\n slv((ii+1)*W-1 downto ii*W) := to_slvcodec(data(ii));\n end loop;\n return slv; \n end function;\n\n function from_slvcodec (constant slv: std_logic_vector) return array_of_complex is\n constant W: natural := complex_t_slvcodecwidth;\n constant N: natural := slv'length/W;\n variable mapped: std_logic_vector(slv'length-1 downto 0);\n variable output: array_of_complex(N-1 downto 0);\n begin\n mapped := slv;\n for ii in 0 to N-1 loop\n output(ii) := from_slvcodec(mapped((ii+1)*W-1 downto ii*W));\n end loop;\n return output; \n end function;\n\n function to_slvcodec (constant data: complex_t) return std_logic_vector is\n constant W0: natural := 0;\n constant W1: natural := W0 + fixed_width;\n constant W2: natural := W1 + fixed_width;\n variable slv: std_logic_vector(complex_t_slvcodecwidth-1 downto 0);\n begin\n slv(W1-1 downto W0) := to_slvcodec(data.real);\n slv(W2-1 downto W1) := to_slvcodec(data.imag);\n return slv; \n end function;\n\n function from_slvcodec (constant slv: std_logic_vector) return complex_t is\n constant W0: natural := 0;\n constant W1: natural := W0 + fixed_width;\n constant W2: natural := W1 + fixed_width;\n variable data: complex_t;\n variable mapped: std_logic_vector(complex_t_slvcodecwidth-1 downto 0);\n begin\n mapped := slv;\n data.real := from_slvcodec(mapped(W1-1 downto W0)); \n data.imag := from_slvcodec(mapped(W2-1 downto W1)); \n return data; \n end function;\n\n end package body;\n\n\nGeneration of file-based testbenches\n------------------------------------\n\nHere's an example entity that just returns the magnitude squared of a complex data type\nthat we defined earlier.\n\n.. code:: vhdl\n\n library ieee;\n use ieee.numeric_std.all;\n use work.complex.all;\n\n entity complex_mag2 is\n port (\n i: in complex_t;\n o: out unsigned(FIXED_WIDTH+1-1 downto 0)\n );\n end entity;\n\n architecture arch of complex_mag2 is\n\n signal real2: signed(FIXED_WIDTH*2-1 downto 0);\n signal imag2: signed(FIXED_WIDTH*2-1 downto 0);\n signal mag2: unsigned(FIXED_WIDTH*2-1 downto 0);\n signal scaled_mag2: unsigned(FIXED_WIDTH+1-1 downto 0);\n\n begin\n\n real2 <= i.real * i.real;\n imag2 <= i.imag * i.imag;\n mag2 <= unsigned(real2) + unsigned(imag2);\n\n scaled_mag2 <= mag2(FIXED_WIDTH*2-1-1 downto FIXED_WIDTH-2);\n\n o <= scaled_mag2;\n\n end architecture;\n\nWe can use slvcodec to generate a testbench that reads input data from a file,\nand writes output data to another file.\n\n.. code:: python\n\n import os\n\n from slvcodec import filetestbench_generator\n\n\n thisdir = os.path.dirname(__file__)\n\n\n def make_slvcodec_package():\n complex_pkg_fn = os.path.join(thisdir, 'complex_pkg.vhd')\n directory = os.path.join(thisdir, 'generated')\n os.mkdir(directory)\n slvcodec_files = filetestbench_generator.add_slvcodec_files(directory, [complex_pkg_fn])\n return slvcodec_files\n\n\n def make_complex_mag2_testbench():\n base_filenames = [\n os.path.join(thisdir, 'complex_pkg.vhd'),\n os.path.join(thisdir, 'complex_mag2.vhd'),\n ]\n slvcodec_fns = make_slvcodec_package()\n with_slvcodec_fns = base_filenames + slvcodec_fns\n directory = os.path.join(thisdir, 'generated')\n generated_fns, generated_wrapper_fns, resolved = filetestbench_generator.prepare_files(\n directory=directory, filenames=with_slvcodec_fns,\n top_entity='complex_mag2')\n return generated_fns\n\n\n if __name__ == '__main__':\n make_complex_mag2_testbench()\n\n\nThis will generate the following VHDL testbench.\n\n.. code:: vhdl\n\n library ieee;\n use ieee.std_logic_1164.all;\n use work.slvcodec.all;\n use ieee.numeric_std.all;\n use work.complex.all;\n use work.complex_slvcodec.all;\n\n entity complex_mag2_tb is\n generic (\n\n CLOCK_PERIOD: time := 10 ns;\n RUNNER_CFG: string;\n OUTPUT_PATH: string\n );\n end entity;\n\n architecture arch of complex_mag2_tb is\n type t_input is\n record\n i: complex_t;\n end record;\n type t_output is\n record\n o: unsigned((1+fixed_width)-1 downto 0);\n end record;\n constant t_input_slvcodecwidth: natural := 2*fixed_width;\n function to_slvcodec (constant data: t_input) return std_logic_vector;\n function from_slvcodec (constant slv: std_logic_vector) return t_input;\n function to_slvcodec (constant data: t_input) return std_logic_vector is\n constant W0: natural := 0;\n constant W1: natural := W0 + 2*fixed_width;\n variable slv: std_logic_vector(t_input_slvcodecwidth-1 downto 0);\n begin\n slv(W1-1 downto W0) := to_slvcodec(data.i);\n return slv; \n end function;\n\n function from_slvcodec (constant slv: std_logic_vector) return t_input is\n constant W0: natural := 0;\n constant W1: natural := W0 + 2*fixed_width;\n variable data: t_input;\n variable mapped: std_logic_vector(t_input_slvcodecwidth-1 downto 0);\n begin\n mapped := slv;\n data.i := from_slvcodec(mapped(W1-1 downto W0)); \n return data; \n end function;\n constant t_output_slvcodecwidth: natural := (1+fixed_width);\n function to_slvcodec (constant data: t_output) return std_logic_vector;\n function from_slvcodec (constant slv: std_logic_vector) return t_output;\n function to_slvcodec (constant data: t_output) return std_logic_vector is\n constant W0: natural := 0;\n constant W1: natural := W0 + (1+fixed_width);\n variable slv: std_logic_vector(t_output_slvcodecwidth-1 downto 0);\n begin\n slv(W1-1 downto W0) := to_slvcodec(data.o);\n return slv; \n end function;\n\n function from_slvcodec (constant slv: std_logic_vector) return t_output is\n constant W0: natural := 0;\n constant W1: natural := W0 + (1+fixed_width);\n variable data: t_output;\n variable mapped: std_logic_vector(t_output_slvcodecwidth-1 downto 0);\n begin\n mapped := slv;\n data.o := from_slvcodec(mapped(W1-1 downto W0)); \n return data; \n end function;\n signal input_data: t_input;\n signal output_data: t_output;\n signal input_slv: std_logic_vector(t_input_slvcodecwidth-1 downto 0);\n signal output_slv: std_logic_vector(t_output_slvcodecwidth-1 downto 0);\n signal clk: std_logic;\n signal read_clk: std_logic;\n signal write_clk: std_logic;\n begin\n\n input_data <= from_slvcodec(input_slv);\n output_slv <= to_slvcodec(output_data);\n\n file_reader: entity work.ReadFile\n generic map(FILENAME => OUTPUT_PATH & \"/indata.dat\",\n PASSED_RUNNER_CFG => RUNNER_CFG,\n WIDTH => t_input_slvcodecwidth)\n port map(clk => read_clk,\n out_data => input_slv);\n\n file_writer: entity work.WriteFile\n generic map(FILENAME => OUTPUT_PATH & \"/outdata.dat\",\n WIDTH => t_output_slvcodecwidth)\n port map(clk => write_clk,\n in_data => output_slv);\n\n clock_generator: entity work.ClockGenerator\n generic map(CLOCK_PERIOD => CLOCK_PERIOD,\n CLOCK_OFFSET => 0 ns\n )\n port map(clk => clk);\n\n read_clock_generator: entity work.ClockGenerator\n generic map(CLOCK_PERIOD => CLOCK_PERIOD,\n CLOCK_OFFSET => CLOCK_PERIOD/10\n )\n port map(clk => read_clk);\n\n write_clock_generator: entity work.ClockGenerator\n generic map(CLOCK_PERIOD => CLOCK_PERIOD,\n CLOCK_OFFSET => 4*CLOCK_PERIOD/10\n )\n port map(clk => write_clk);\n\n dut: entity work.complex_mag2\n port map(\n i => input_data.i,\n o => output_data.o\n );\n\n end architecture;\n\n\nBut generating a test bench that just reads and writes the input and output data\nto and from files isn't particularly useful unless we have a way of generating the\ninput data, and checking the output data. Slvcodec include tools to do this\nwith python.\n\nPython-based testing\n--------------------\n\nWe define a python class with a ``make_input_data`` method that returns an iterable of\ndictionaries specifying the input data, and a ``check_output_data`` method that receives\na list of input_data dictionaries and a list of output data dictionaries, that raises an\nexeception is the output data is incorrect.\n\n.. code:: python\n\n class ComplexMag2Test:\n\n def __init__(self, resolved, generics, top_params):\n # Here we're taking advantage of the fact that when the test is intialized it\n # has access to the parsed VHDL. We use that to get the value of the constant\n # FIXED_WIDTH that is defined in complex_pkg.vhd.\n self.fixed_width = resolved['packages']['complex'].constants['fixed_width'].value()\n self.max_fixed = pow(2, self.fixed_width-1)-1\n self.min_fixed = -pow(2, self.fixed_width-1)\n self.n_data = 100\n\n def fixed_to_float(self, f):\n r = f / pow(2, self.fixed_width-2)\n return r\n\n def make_input_data(self, seed=None, n_data=3000):\n input_data = [{\n 'i': {'real': random.randint(self.min_fixed, self.max_fixed),\n 'imag': random.randint(self.min_fixed, self.max_fixed)},\n } for i in range(self.n_data)]\n\n return input_data\n\n def check_output_data(self, input_data, output_data):\n inputs = [self.fixed_to_float(d['i']['real']) + self.fixed_to_float(d['i']['imag']) * 1j\n for d in input_data]\n input_float_mag2s = [abs(v)*abs(v) for v in inputs] \n outputs = [self.fixed_to_float(d['o']) for d in output_data]\n differences = [abs(expected - actual) for expected, actual in zip(input_float_mag2s, outputs)]\n allowed_error = 1/pow(2, self.fixed_width-2)\n assert all([d < allowed_error for d in differences])\n\n\nWe then use ``slvcodec.test_utils.register_test_with_vunit`` to generate an appropriate testbench and input\ndata file, and register the produced test with vunit. VUnit can then be run as normal.\n\n\n.. code:: python\n\n from slvcodec import test_utils, config\n import os\n\n if __name__ == '__main__':\n random.seed(0)\n # Initialize vunit with command line parameters.\n vu = config.setup_vunit()\n # Set up logging.\n config.setup_logging(vu.log_level)\n # Get filenames for test\n this_dir = os.path.dirname(os.path.realpath(__file__))\n filenames = [\n os.path.join(this_dir, 'complex_pkg.vhd'),\n os.path.join(this_dir, 'complex_mag2.vhd'),\n ]\n # Register the test with VUnit.\n test_output_directory = os.path.join(this_dir, 'generated')\n test_utils.register_test_with_vunit(\n vu=vu,\n directory=test_output_directory,\n filenames=filenames,\n top_entity='complex_mag2',\n all_generics=[{}],\n test_class=ComplexMag2Test,\n top_params={},\n )\n # Run the tests with VUnit\n vu.set_sim_option('disable_ieee_warnings', True)\n vu.main()\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/benreynwar/slvcodec", "keywords": "VHDL,hdl,rtl,FPGA,ASIC,Xilinx,Altera", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "slvcodec", "package_url": "https://pypi.org/project/slvcodec/", "platform": "", "project_url": "https://pypi.org/project/slvcodec/", "project_urls": { "Homepage": "https://github.com/benreynwar/slvcodec" }, "release_url": "https://pypi.org/project/slvcodec/0.3.3/", "requires_dist": [ "jinja2 (>=2.8)", "pytest", "vunit-hdl", "axilent (>=0.1.3)", "pyyaml" ], "requires_python": "", "summary": "Utilities for generating VHDL to convert to and from std_logic_vector, as well as utilties to create testbenches described by python.", "version": "0.3.3" }, "last_serial": 5961584, "releases": { "0.2": [ { "comment_text": "", "digests": { "md5": "7674459f9391f713a994bafa6059fd3f", "sha256": "9e74328cc725afcf4e9519ec93a064906114d958f7cc99df505899542d477fb1" }, "downloads": -1, "filename": "slvcodec-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7674459f9391f713a994bafa6059fd3f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 58462, "upload_time": "2019-03-11T23:10:59", "url": "https://files.pythonhosted.org/packages/b0/a1/31c921af670f3f3ba6ed84bfa85b3473d31a2c996401f023bf0800f9dada/slvcodec-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ab85eb1ed407df97458f271a388eac27", "sha256": "3bf2b789da454650fc1de83d9ee42634e461164476eecb53be1c14ec3336884e" }, "downloads": -1, "filename": "slvcodec-0.2.tar.gz", "has_sig": false, "md5_digest": "ab85eb1ed407df97458f271a388eac27", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51883, "upload_time": "2019-03-11T23:11:01", "url": "https://files.pythonhosted.org/packages/2e/58/a8ff606e97e4899632f94f1325fcabcc33315abd704405e3b33aa6f64fa9/slvcodec-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "b7b7f6140bb4f0f22adbd73c9e26276d", "sha256": "55c800ab471db54b544339dd37ac113def27ee61a2ba65eeb06a048d2052ce3a" }, "downloads": -1, "filename": "slvcodec-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b7b7f6140bb4f0f22adbd73c9e26276d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 62571, "upload_time": "2019-04-10T20:21:25", "url": "https://files.pythonhosted.org/packages/07/d6/e8c9387882ee78b910fdd1bab3e1da55323d9dddf44482b25f681bf60e67/slvcodec-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "98af9071c38463fa1fd24a453182b18a", "sha256": "4c33f1806f4a8d2cc505579aa6adf1c9ce7d54fc3148b196553e38484c67d1af" }, "downloads": -1, "filename": "slvcodec-0.2.1.tar.gz", "has_sig": false, "md5_digest": "98af9071c38463fa1fd24a453182b18a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55870, "upload_time": "2019-04-10T20:21:27", "url": "https://files.pythonhosted.org/packages/aa/5d/770374e73e5c79e674567e4fe1a621955f43883ee186d3e288993e742a72/slvcodec-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "d38d88ea131eed491a3f78f7e46d34f1", "sha256": "a75bfdbc8b92b297d24e3c2d99df13b7388b1a825d292714587891b1f5f11ab0" }, "downloads": -1, "filename": "slvcodec-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d38d88ea131eed491a3f78f7e46d34f1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 58504, "upload_time": "2019-08-16T17:56:42", "url": "https://files.pythonhosted.org/packages/3b/a8/1bbb569231d77af18f3ac7ab45149e09d2011b713c8374dada3b655974ef/slvcodec-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0a063ce3b15c46da6c7a3757f8e4c97e", "sha256": "1c144f543ae7f5295da92e02798bb118401b4f64dc98b21c86848d35a4b19f6f" }, "downloads": -1, "filename": "slvcodec-0.2.2.tar.gz", "has_sig": false, "md5_digest": "0a063ce3b15c46da6c7a3757f8e4c97e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56047, "upload_time": "2019-08-16T17:56:44", "url": "https://files.pythonhosted.org/packages/c0/25/cecdf74508efae89eaaa64329bc359ba041eb2d1c6eb5ab4d24c78d57552/slvcodec-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "806c0312e537ebc510d15d3cdac5ad59", "sha256": "a0d05903faacacdcd177d9d4654893bf4c8fe109cb88996d67a4ef6786b2a302" }, "downloads": -1, "filename": "slvcodec-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "806c0312e537ebc510d15d3cdac5ad59", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 57218, "upload_time": "2019-10-01T17:11:39", "url": "https://files.pythonhosted.org/packages/7f/2c/ad018da6b23a48ab7092f5fd5cf1ea1273e90d497516e9f4a1038d58c8fa/slvcodec-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "abb0664bc1c213e6744ab0e70ebbb14d", "sha256": "644488170815e127efd5a344b5bb9d19c5f8e12a68144dc362e8dad5fc552f9d" }, "downloads": -1, "filename": "slvcodec-0.2.3.tar.gz", "has_sig": false, "md5_digest": "abb0664bc1c213e6744ab0e70ebbb14d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55036, "upload_time": "2019-10-01T17:11:41", "url": "https://files.pythonhosted.org/packages/ce/ef/2f5711e4b31fad33fb14bfc706c6e4aaa3d21f7640d4fb01f65f33871a95/slvcodec-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "ecaa4f59b3f210c8219c6a1512c539b0", "sha256": "bfaf97dcad009eafef42dd977536ef61d49e83fdd0fcb2a5e6bca89530ccd52b" }, "downloads": -1, "filename": "slvcodec-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "ecaa4f59b3f210c8219c6a1512c539b0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 57239, "upload_time": "2019-10-04T00:46:23", "url": "https://files.pythonhosted.org/packages/5e/b9/a8b252dc22e3713c5b0b54ae8b3cf360d34cc06b85ea4746f30ca516ac49/slvcodec-0.2.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e95b654293ea75fa63f729bfb7a3da65", "sha256": "5706e2e98c49df459ed1b903309d144df0eb8232945cbe9d404db737b935ace2" }, "downloads": -1, "filename": "slvcodec-0.2.4.tar.gz", "has_sig": false, "md5_digest": "e95b654293ea75fa63f729bfb7a3da65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55083, "upload_time": "2019-10-04T00:46:25", "url": "https://files.pythonhosted.org/packages/e0/ce/80cb15a2bb6be933aedbc89d0437084b938031305b0a60ad511bafdb9e49/slvcodec-0.2.4.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "da9111efcc90ed81b89667deaf4a9cd9", "sha256": "272bcb6014328072828e3e2a7c9e535e2d76a69482c28f15042f4dd634edf23a" }, "downloads": -1, "filename": "slvcodec-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "da9111efcc90ed81b89667deaf4a9cd9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 66109, "upload_time": "2019-10-04T04:56:22", "url": "https://files.pythonhosted.org/packages/c8/61/a95f1b33ec990e6bfd36d544526821ad5acc2985f53e9ec2400302910215/slvcodec-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2a2175fc6b6b76336f4b0f66cdfaaa04", "sha256": "717956780ee99ddef9dd8e752e301b0cedbebf13c776329ff579e05417c4f555" }, "downloads": -1, "filename": "slvcodec-0.3.0.tar.gz", "has_sig": false, "md5_digest": "2a2175fc6b6b76336f4b0f66cdfaaa04", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62150, "upload_time": "2019-10-04T04:56:25", "url": "https://files.pythonhosted.org/packages/3b/7f/e17cff1d0d3f525023adac329922ce9b240cebbe292e681bcbceed711fc6/slvcodec-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "6e7d38a52084fa79b8b0a5c6c7bf97c8", "sha256": "179ab20cf8f01a3fc0421e2de46e0f963da779e4ad554b49f9a97ad27b739242" }, "downloads": -1, "filename": "slvcodec-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6e7d38a52084fa79b8b0a5c6c7bf97c8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 66237, "upload_time": "2019-10-07T19:31:25", "url": "https://files.pythonhosted.org/packages/fd/2c/ce75422ce1ef3e1c6210feba9ba4870cc37633fb87370613d2a80658dea1/slvcodec-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d16275f585d96866c4e712ad076e530d", "sha256": "63975e5ba083066af5266f918aa471c8aa70ede21e4443e21c436d5cc7f568fc" }, "downloads": -1, "filename": "slvcodec-0.3.1.tar.gz", "has_sig": false, "md5_digest": "d16275f585d96866c4e712ad076e530d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62286, "upload_time": "2019-10-07T19:31:28", "url": "https://files.pythonhosted.org/packages/7b/41/7b0dae14b5c224649a49dad44cbec8dc9975d5096d05d4b29ebc9beb0cbb/slvcodec-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "5af7a3774f676e4f45f76a5ce6945fbc", "sha256": "ff5a6c355ebefb45b1e19d4293912400024924953f504b8014efad0960ae5af2" }, "downloads": -1, "filename": "slvcodec-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "5af7a3774f676e4f45f76a5ce6945fbc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 70982, "upload_time": "2019-10-11T17:16:07", "url": "https://files.pythonhosted.org/packages/35/e5/d1df2c108353d3ef1a6832df9f4ddf7b5cb0a4a12b09e8188433e87c5eaa/slvcodec-0.3.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "753eefcefd5fd7e1608d4bea220f3f21", "sha256": "25081902af8257e36fb35c1a5b092069dcc384d68a582885672fb92b82328c67" }, "downloads": -1, "filename": "slvcodec-0.3.2.tar.gz", "has_sig": false, "md5_digest": "753eefcefd5fd7e1608d4bea220f3f21", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58567, "upload_time": "2019-10-11T17:16:10", "url": "https://files.pythonhosted.org/packages/27/a9/f5f718537a7fecae95100ce5f1cf31e3f363ccfe171ccc24e4600802a287/slvcodec-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "e8ef9e03c68b099561fd31f8670dd1cc", "sha256": "5ea0d60f29bf7bed4a90347d6927a4e1e5ae841be66ac67061fb7cdaa648caa2" }, "downloads": -1, "filename": "slvcodec-0.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e8ef9e03c68b099561fd31f8670dd1cc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 66926, "upload_time": "2019-10-11T18:41:19", "url": "https://files.pythonhosted.org/packages/98/01/7c2f4a4d1d7ccf0b5e68ee28e133bacf30ae0512a5c29b89ebb5744b5f6b/slvcodec-0.3.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aab1f007fbb587afb86892e0d0bf3175", "sha256": "9c7718236efe3b34be52eea7df3a7594d2d1d9990ac7722481e9a5dc70dc889d" }, "downloads": -1, "filename": "slvcodec-0.3.3.tar.gz", "has_sig": false, "md5_digest": "aab1f007fbb587afb86892e0d0bf3175", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62528, "upload_time": "2019-10-11T18:41:21", "url": "https://files.pythonhosted.org/packages/66/43/827fefbd88247d8ab151ddea0d13e11cdd18435e083bf609cb72523b1616/slvcodec-0.3.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e8ef9e03c68b099561fd31f8670dd1cc", "sha256": "5ea0d60f29bf7bed4a90347d6927a4e1e5ae841be66ac67061fb7cdaa648caa2" }, "downloads": -1, "filename": "slvcodec-0.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e8ef9e03c68b099561fd31f8670dd1cc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 66926, "upload_time": "2019-10-11T18:41:19", "url": "https://files.pythonhosted.org/packages/98/01/7c2f4a4d1d7ccf0b5e68ee28e133bacf30ae0512a5c29b89ebb5744b5f6b/slvcodec-0.3.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aab1f007fbb587afb86892e0d0bf3175", "sha256": "9c7718236efe3b34be52eea7df3a7594d2d1d9990ac7722481e9a5dc70dc889d" }, "downloads": -1, "filename": "slvcodec-0.3.3.tar.gz", "has_sig": false, "md5_digest": "aab1f007fbb587afb86892e0d0bf3175", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62528, "upload_time": "2019-10-11T18:41:21", "url": "https://files.pythonhosted.org/packages/66/43/827fefbd88247d8ab151ddea0d13e11cdd18435e083bf609cb72523b1616/slvcodec-0.3.3.tar.gz" } ] }