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