{
  "cells": [
    {
      "cell_type": "code",
      "source": [
        "# Change these values to calculate the needed values\n",
        "requirements = {\"inputs\": 8, \"outputs\":8}\n",
        "\n",
        "\n",
        "# Do not edit below this Point unless you know what you are doing\n",
        "data = {\n",
        "    \"mami-input\": {\n",
        "        \"input-channels\": 2,\n",
        "        \"parts\": [\n",
        "            {\"MPN\": \"PJ301M-12\", \"n\": 2},\n",
        "            {\"MPN\": \"Subminiature On-Off-(On) Toggle switch\", \"n\": 2},\n",
        "        ]\n",
        "    },\n",
        "    \"mami-output\": {\n",
        "        \"output-channels\": 2,\n",
        "        \"parts\": [\n",
        "            {\"MPN\": \"LME49720\", \"n\": 2},\n",
        "            {\"MPN\": \"100nF 0605 25V\", \"n\": 4},\n",
        "            {\"MPN\": \"100k 0805\", \"n\": 8},\n",
        "            {\"MPN\": \"PJ301M-12\", \"n\": 2}\n",
        "        ]\n",
        "    },\n",
        "    \"mami-quad\": {\n",
        "        \"input-channels\":2, \"output-channels\":2,\n",
        "        \"parts\": [\n",
        "            {\"MPN\": \"P0915N-FC15BR100K\", \"n\": 4},\n",
        "            {\"MPN\": \"Knob\", \"n\": 4},\n",
        "            {\"MPN\": \"100k 0805\", \"n\": 4}\n",
        "        ]\n",
        "    }\n",
        "}\n",
        "\n",
        "# Calculate how many PCBs are needed\n",
        "n_input_modules = int(requirements[\"inputs\"] / data[\"mami-input\"][\"input-channels\"])\n",
        "n_output_modules = int(requirements[\"outputs\"] / data[\"mami-output\"][\"output-channels\"])\n",
        "n_quad_modules = int((requirements[\"inputs\"] * requirements[\"outputs\"]) / (data[\"mami-output\"][\"output-channels\"] * data[\"mami-input\"][\"input-channels\"]))\n",
        "\n",
        "\n",
        "\n",
        "Print the PCB\n",
        "print(\"Needed for a {}x{} Matrix Mixer\".format(requirements[\"inputs\"], requirements[\"outputs\"]))\n",
        "print(\"{}\".format(\"=\"*50))\n",
        "print(\"{0:>5}x MAMI-INPUT-Module\".format(n_input_modules))\n",
        "print(\"{0:>5}x MAMI-OUTPUT-Module\".format(n_output_modules))\n",
        "print(\"{0:>5}x MAMI-QUAD-Module\\n\".format(n_quad_modules))\n",
        "\n",
        "# Collect all the parts\n",
        "bom = {}\n",
        "\n",
        "for part in data[\"mami-input\"][\"parts\"]*n_input_modules + data[\"mami-quad\"][\"parts\"]*n_quad_modules + data[\"mami-output\"][\"parts\"]*n_output_modules:\n",
        "    if part[\"MPN\"] in bom:\n",
        "        bom[part[\"MPN\"]] += part[\"n\"]\n",
        "    else:\n",
        "        bom[part[\"MPN\"]] = part[\"n\"]\n",
        "\n",
        "# Print the BOM\n",
        "print(\"Parts\\n{}\".format(\"=\"*50))\n",
        "for key, value in bom.items():\n",
        "    print(\"{:>5}x {}\".format(value, key))"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Needed for a 8x8 Matrix Mixer:\n",
            "==================================================\n",
            "    4x MAMI-INPUT-Module\n",
            "    4x MAMI-OUTPUT-Module\n",
            "   16x MAMI-QUAD-Module\n",
            "\n",
            "Parts\n",
            "==================================================\n",
            "   16x PJ301M-12\n",
            "    8x Subminiature On-Off-(On) Toggle switch\n",
            "   64x P0915N-FC15BR100K\n",
            "   64x Knob\n",
            "   96x 100k 0805\n",
            "    8x LME49720\n",
            "   16x 100nF 0605 25V\n"
          ]
        }
      ],
      "execution_count": 29,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    },
    {
      "cell_type": "code",
      "source": [],
      "outputs": [],
      "execution_count": null,
      "metadata": {
        "collapsed": false,
        "outputHidden": false,
        "inputHidden": false
      }
    }
  ],
  "metadata": {
    "kernel_info": {
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.7.3",
      "mimetype": "text/x-python",
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "pygments_lexer": "ipython3",
      "nbconvert_exporter": "python",
      "file_extension": ".py"
    },
    "kernelspec": {
      "name": "python3",
      "language": "python",
      "display_name": "Python 3"
    },
    "nteract": {
      "version": "0.15.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}