Skip to content

Commit b000c82

Browse files
committed
Add JESD basic calculator page for jiftools
Signed-off-by: Travis F. Collins <travis.collins@analog.com>
1 parent b2abbcb commit b000c82

2 files changed

Lines changed: 87 additions & 0 deletions

File tree

adijif/tools/explorer/src/pages/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
from .clockconfigurator import ClockConfigurator
77
from .jesdmodeselector import JESDModeSelector
88
from .systemconfigurator import SystemConfigurator
9+
from .jesdbasic import JESDBasic
910

1011
PAGE_MAP: Dict[str, Type[Page]] = {
1112
"JESD204 Mode Selector": JESDModeSelector,
1213
"Clock Configurator": ClockConfigurator,
1314
"System Configurator": SystemConfigurator,
15+
"Basic JESD204 Calculator": JESDBasic,
1416
}
1517

1618
__all__ = ["PAGE_MAP"]
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
"""Basic JESD204 Calculator."""
2+
3+
from typing import Optional
4+
5+
import streamlit as st
6+
import pandas as pd
7+
8+
from ..utils import Page
9+
10+
class JESDBasic(Page):
11+
"""Basic JESD204 calculator page."""
12+
13+
def __init__(self, state: Optional[object]) -> None:
14+
"""Initialize basic JESD204 calculator page.
15+
16+
Args:
17+
state: Application state object
18+
"""
19+
self.state = state
20+
21+
def write(self) -> None:
22+
"""Render the basic JESD204 calculator page."""
23+
st.title("Basic JESD204 Calculator")
24+
25+
# Horizontal line
26+
st.markdown("---")
27+
28+
# Add int boxes for L, M, Np, JESD Class
29+
jesd_params, output_table = st.columns(2)
30+
with jesd_params:
31+
st.header("JESD204 Parameters")
32+
33+
L_c, M_c= st.columns(2)
34+
35+
with L_c:
36+
L = st.number_input("L (number of lanes)", min_value=1, step=1, value=4)
37+
with M_c:
38+
M = st.number_input("M (number of converters)", min_value=1, step=1, value=4)
39+
40+
np_c, class_c = st.columns(2)
41+
with np_c:
42+
Np = st.number_input("Np (Bits per sample)", min_value=1, step=1, value=16)
43+
44+
with class_c:
45+
jesd_class = st.selectbox("JESD204 Class", ["JESD204B", "JESD204C"])
46+
47+
label_c, value_c = st.columns(2)
48+
with label_c:
49+
clock_ref_source = st.selectbox("Clock Reference Source", ["Sample Rate", "Lane Rate"])
50+
51+
with value_c:
52+
if clock_ref_source == "Sample Rate":
53+
sample_rate = st.number_input("Sample Rate (SPS)", min_value=1.0, step=1.0, value=100e6)
54+
else:
55+
lane_rate = st.number_input("Lane Rate (Gbps)", min_value=0.1, step=0.1, value=10.0)
56+
57+
if jesd_class == "JESD204B":
58+
encoding_factor = float(10) / float(8) # Assuming 16-bit samples for simplicity
59+
else:
60+
encoding_factor = float(66) / float(64) # Assuming 16-bit samples for simplicity
61+
62+
# Lane rate = (M * Np * Sample Rate * encoding_factor) / L
63+
if clock_ref_source == "Sample Rate":
64+
rate = (M * Np * sample_rate * encoding_factor) / L / 1e9 # Convert to Gbps
65+
label = "Lane Rate (Gbps)"
66+
if jesd_class == "JESD204B":
67+
core_clock = rate / 40 * 1e3 # Convert to MHz
68+
else:
69+
core_clock = rate / 66 * 1e3 # Convert to MHz
70+
else:
71+
# lane_rate_gbps = lane_rate
72+
rate = (lane_rate * 1e9 * L) / (M * Np * encoding_factor) / 1e6 # Convert to MSPS
73+
label = "Sample Rate (MSPS)"
74+
if jesd_class == "JESD204B":
75+
core_clock = lane_rate / 40 * 1e3 # Convert to MHz
76+
else:
77+
core_clock = lane_rate / 66 * 1e3 # Convert to MHz
78+
79+
with output_table:
80+
st.header("Derived Parameters")
81+
df = pd.DataFrame({
82+
"Parameter": [label, "Core Clock (MHz)"],
83+
"Value": [rate, core_clock]
84+
})
85+
st.table(df)

0 commit comments

Comments
 (0)