Skip to content
Snippets Groups Projects
Commit 044b7b9d authored by Hangzhi Yu's avatar Hangzhi Yu
Browse files

Merge branch '2-add-support-for-banks-on-fpga' into 'master'

Resolve "Add support for banks on FPGA"

Closes #2

See merge request !2
parents d448d62d 2d661fc8
No related branches found
No related tags found
2 merge requests!5Master,!2Resolve "Add support for banks on FPGA"
"""Module that manages FPGA banks."""
import json
from typing import Optional, Tuple, Iterable, Generator, Iterator
_banks = {}
VOLTAGES = {1.2, 1.5, 1.8, 2.5, 3.3}
class FPGABank:
"""Represents a bank on the FPGA."""
def __init__(self, name, voltage=3.3):
self.name = name
self.voltage = voltage
def init(filename: str) -> None:
"""
Initializes the FPGA bank database by loading the bank configuration from the specified filename. The file must be
in JSON format and contains bank settings, indexed by the FPGA's bank names.
:param filename: FPGA bank configuration file
"""
global _banks
_banks = {}
try:
with open(filename, "r") as file:
bank_data = json.load(file)
for bank, bank_args in bank_data.items():
voltage = bank_args["voltage"]
if voltage in VOLTAGES:
_banks[bank] = FPGABank(name=bank,
voltage=voltage)
else:
raise Exception("invalid voltage")
except OSError as e:
raise Exception("failed to load bank data file: %s" % e)
def get_voltage(bank_id: int) -> float:
return _banks.get(str(bank_id), _banks["0"]).voltage
......@@ -2,6 +2,8 @@
import json
from typing import Optional, Tuple, Iterable, Generator, Iterator
from .Banks import get_voltage
_pins = {}
PIN_RESERVED = 0
......@@ -22,7 +24,7 @@ _PIN_COLORS = {
class FPGAPin:
"""Represents a physical pin on the FPGA."""
def __init__(self, name, display_name=None, supports_pwm=True, supports_output=True, supports_input=True,
fpga_addr=31, device_pin=None, voltage=True):
fpga_addr=31, device_pin=None, bank=None):
self.name = name
self.display_name = display_name or name
self.supports_pwm = supports_pwm
......@@ -30,7 +32,7 @@ class FPGAPin:
self.supports_input = supports_input
self.fpga_addr = fpga_addr
self.device_pin = device_pin
self.voltage = voltage
self.voltage = str(get_voltage(bank)).replace(".", "")
def is_assigned(self) -> bool:
"""
......@@ -85,8 +87,8 @@ def init(filename: str) -> None:
in JSON format and contains pin settings, indexed by the FPGA's pin names. At the very least, each pin must
contain the properties 'addr' (an integer describing the pin's internal adress) and 'pwm' (a Boolean value
describing whether the pin supports PWM output). Optionally, it can also contain a 'name' attribute (a string
overriding the FPGA pin name for the preview image) and 'output', 'input' and '3.3v' attributes (Boolean values
describing whether the pin supports output, input or 3.3v, respectively, defaulting to True).
overriding the FPGA pin name for the preview image) and 'output' and 'input' attributes (Boolean values
describing whether the pin supports output or input, respectively, defaulting to True).
Example of a configuration file:
{
......@@ -124,7 +126,7 @@ def init(filename: str) -> None:
supports_input=pin_args.get("input", True),
supports_output=pin_args.get("output", True),
fpga_addr=pin_args.get("addr", 31),
voltage=pin_args.get("3.3v", True))
bank=pin_args["bank"])
except OSError as e:
raise Exception("failed to load pin data file: %s" % e)
......
......@@ -3,7 +3,7 @@ import sys
from qtpy import QtWidgets
from fpga_device_manager import Devices, Inputs, Pins
from fpga_device_manager import Devices, Inputs, Pins, Banks
from fpga_device_manager.windows.main_window import MainWindow
if __name__ == '__main__':
......@@ -11,6 +11,7 @@ if __name__ == '__main__':
Devices.init(os.path.join(base_data_path, "device_types.json"))
Inputs.init(os.path.join(base_data_path, "input_types.json"))
Banks.init(os.path.join(base_data_path, "banks.json"))
Pins.init(os.path.join(base_data_path, "pins.json"))
# Create some directories if possible
......
{
"0": {
"voltage": 3.3
},
"1": {
"voltage": 2.5
},
"2": {
"voltage": 3.3
},
"3": {
"voltage": 2.5
},
"4": {
"voltage": 3.3
},
"5": {
"voltage": 3.3
}
}
\ No newline at end of file
{
"1": {
"pwm": true,
"addr": 0
"addr": 0,
"bank": 5
},
"2": {
"pwm": true,
"addr": 1
"addr": 1,
"bank": 5
},
"3": {
"pwm": true,
"addr": 2
"addr": 2,
"bank": 5
},
"4": {
"pwm": true,
"addr": 3
"addr": 3,
"bank": 5
},
"6": {
"pwm": true,
"addr": 4
"addr": 4,
"bank": 5
},
"9": {
"pwm": true,
"addr": 5
"addr": 5,
"bank": 5
},
"10": {
"pwm": true,
"addr": 6
"addr": 6,
"bank": 5
},
"11": {
"pwm": true,
"addr": 7
"addr": 7,
"bank": 5
},
"12": {
"pwm": true,
"addr": 8
"addr": 8,
"bank": 5
},
"13": {
"pwm": true,
"addr": 9
"addr": 9,
"bank": 4
},
"14": {
"pwm": true,
"addr": 10
"addr": 10,
"bank": 4
},
"19": {
"pwm": true,
"addr": 11
"addr": 11,
"bank": 4
},
"20": {
"pwm": true,
"addr": 12
"addr": 12,
"bank": 4
},
"21": {
"pwm": true,
"addr": 13
"addr": 13,
"bank": 4
},
"22": {
"pwm": true,
"addr": 14
"addr": 14,
"bank": 4
},
"23": {
"pwm": true,
"addr": 15
"addr": 15,
"bank": 4
},
"25": {
"pwm": true,
"addr": 16
"addr": 16,
"bank": 3
},
"26": {
"pwm": true,
"addr": 17
"addr": 17,
"bank": 3
},
"27": {
"pwm": true,
"addr": 18
"addr": 18,
"bank": 3
},
"32": {
"pwm": true,
"addr": 19
"addr": 19,
"bank": 3
},
"33": {
"pwm": true,
"addr": 20
"addr": 20,
"bank": 3
},
"34": {
"pwm": true,
"addr": 21
"addr": 21,
"bank": 3
},
"35": {
"pwm": true,
"addr": 22
"addr": 22,
"bank": 3
},
"97": {
"pwm": true,
"input": false,
"name": "D1",
"addr": 23,
"3.3v": false
"bank": 1
},
"98": {
"pwm": true,
"input": false,
"name": "D2",
"addr": 24,
"3.3v": false
"bank": 1
},
"99": {
"pwm": true,
"input": false,
"name": "D3",
"addr": 25,
"3.3v": false
"bank": 1
},
"100": {
"pwm": true,
"input": false,
"name": "D4",
"addr": 26,
"3.3v": false
"bank": 1
},
"104": {
"pwm": true,
"input": false,
"name": "D5",
"addr": 27,
"3.3v": false
"bank": 1
},
"105": {
"pwm": true,
"input": false,
"name": "D6",
"addr": 28,
"3.3v": false
"bank": 1
},
"106": {
"pwm": true,
"input": false,
"name": "D7",
"addr": 29,
"3.3v": false
"bank": 1
},
"107": {
"pwm": true,
"input": false,
"name": "D8",
"addr": 30,
"bank": 1
},
"38": {
"addr": 50,
"pwm": true
"pwm": true,
"bank": 2
},
"39": {
"addr": 51,
"pwm": true
"pwm": true,
"bank": 2
},
"40": {
"addr": 52,
"pwm": true
"pwm": true,
"bank": 2
},
"41": {
"addr": 53,
"pwm": true
"pwm": true,
"bank": 2
},
"42": {
"addr": 54,
"pwm": true
"pwm": true,
"bank": 2
},
"43": {
"addr": 55,
"pwm": true
"pwm": true,
"bank": 2
},
"44": {
"addr": 56,
"pwm": true
"pwm": true,
"bank": 2
},
"45": {
"addr": 57,
"pwm": true
"pwm": true,
"bank": 2
},
"47": {
"addr": 58,
"pwm": true
"pwm": true,
"bank": 2
},
"48": {
"addr": 59,
"pwm": true
"pwm": true,
"bank": 2
},
"49": {
"addr": 60,
"pwm": true
"pwm": true,
"bank": 2
},
"50": {
"addr": 61,
"pwm": true
"pwm": true,
"bank": 2
},
"52": {
"addr": 62,
"pwm": true
"pwm": true,
"bank": 2
},
"54": {
"addr": 63,
"pwm": true
"pwm": true,
"bank": 2
},
"55": {
"addr": 64,
"pwm": true
"pwm": true,
"bank": 2
},
"56": {
"addr": 65,
"pwm": true
"pwm": true,
"bank": 2
},
"57": {
"addr": 66,
"pwm": true
"pwm": true,
"bank": 2
},
"58": {
"addr": 67,
"pwm": true
"pwm": true,
"bank": 2
},
"59": {
"addr": 68,
"pwm": true
"pwm": true,
"bank": 2
},
"60": {
"addr": 69,
"pwm": true
"pwm": true,
"bank": 2
},
"61": {
"addr": 70,
"pwm": true
"pwm": true,
"bank": 2
},
"62": {
"addr": 71,
"pwm": true
"pwm": true,
"bank": 2
},
"65": {
"addr": 72,
"pwm": true
"pwm": true,
"bank": 2
},
"67": {
"addr": 73,
"pwm": true
"pwm": true,
"bank": 2
},
"68": {
"addr": 74,
"pwm": true
"pwm": true,
"bank": 2
},
"69": {
"addr": 75,
"pwm": true
"pwm": true,
"bank": 2
},
"70": {
"addr": 76,
"pwm": true
"pwm": true,
"bank": 2
},
"71": {
"addr": 77,
"pwm": true
"pwm": true,
"bank": 2
},
"73": {
"addr": 100,
"pwm": true
"pwm": true,
"bank": 1
},
"74": {
"addr": 101,
"pwm": true
"pwm": true,
"bank": 1
},
"75": {
"addr": 102,
"pwm": true
"pwm": true,
"bank": 1
},
"76": {
"addr": 103,
"pwm": true
"pwm": true,
"bank": 1
},
"77": {
"addr": 104,
"pwm": true
"pwm": true,
"bank": 1
},
"78": {
"addr": 105,
"pwm": true
"pwm": true,
"bank": 1
},
"81": {
"addr": 106,
"pwm": true
"pwm": true,
"bank": 1
},
"82": {
"addr": 107,
"pwm": true
"pwm": true,
"bank": 1
},
"83": {
"addr": 108,
"pwm": true
"pwm": true,
"bank": 1
},
"84": {
"addr": 109,
"pwm": true
"pwm": true,
"bank": 1
},
"85": {
"addr": 110,
"pwm": true
"pwm": true,
"bank": 1
},
"86": {
"addr": 111,
"pwm": true
"pwm": true,
"bank": 1
},
"91": {
"addr": 112,
"pwm": true
"pwm": true,
"bank": 1
},
"92": {
"addr": 113,
"pwm": true
"pwm": true,
"bank": 1
},
"93": {
"addr": 114,
"pwm": true
"pwm": true,
"bank": 1
},
"94": {
"addr": 115,
"pwm": true
"pwm": true,
"bank": 1
},
"96": {
"addr": 116,
"pwm": true
"pwm": true,
"bank": 1
},
"95": {
"addr": 117,
"pwm": true
"pwm": true,
"bank": 1
},
"109": {
"addr": 150,
"pwm": true
"pwm": true,
"bank": 0
},
"110": {
"addr": 151,
"pwm": true
"pwm": true,
"bank": 0
},
"111": {
"addr": 152,
"pwm": true
"pwm": true,
"bank": 0
},
"112": {
"addr": 153,
"pwm": true
"pwm": true,
"bank": 0
},
"113": {
"addr": 154,
"pwm": true
"pwm": true,
"bank": 0
},
"114": {
"addr": 155,
"pwm": true
"pwm": true,
"bank": 0
},
"115": {
"addr": 156,
"pwm": true
"pwm": true,
"bank": 0
},
"117": {
"addr": 157,
"pwm": true
"pwm": true,
"bank": 0
},
"119": {
"addr": 158,
"pwm": true
"pwm": true,
"bank": 0
},
"120": {
"addr": 159,
"pwm": true
"pwm": true,
"bank": 0
},
"121": {
"addr": 160,
"pwm": true
"pwm": true,
"bank": 0
},
"122": {
"addr": 161,
"pwm": true
"pwm": true,
"bank": 0
},
"125": {
"addr": 162,
"pwm": true
"pwm": true,
"bank": 0
},
"126": {
"addr": 163,
"pwm": true
"pwm": true,
"bank": 0
},
"127": {
"addr": 164,
"pwm": true
"pwm": true,
"bank": 0
},
"128": {
"addr": 165,
"pwm": true
"pwm": true,
"bank": 0
},
"138": {
"addr": 166,
"pwm": true
"pwm": true,
"bank": 0
},
"139": {
"addr": 167,
"pwm": true
"pwm": true,
"bank": 0
},
"140": {
"addr": 168,
"pwm": true
"pwm": true,
"bank": 0
},
"141": {
"addr": 169,
"pwm": true
"pwm": true,
"bank": 0
},
"142": {
"addr": 170,
"pwm": true
"pwm": true,
"bank": 0
},
"143": {
"addr": 171,
"pwm": true
"pwm": true,
"bank": 0
}
}
......@@ -9,7 +9,7 @@ LOCATE COMP "SDA" SITE "24" ;
// pin {{ pin.display_name }} on physical pin {{ pin.name }}
LOCATE COMP "pin_{{ pin.name }}" SITE "{{ pin.name }}" ;
{% if pin.voltage %}IOBUF PORT "pin_{{ pin.name }}" IO_TYPE=LVCMOS33 ;{% endif %}
IOBUF PORT "pin_{{ pin.name }}" IO_TYPE=LVCMOS{{ pin.voltage }} ;
{% endfor %}
LOCATE COMP "btn_reset" SITE "28" ;
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment