The visualization module provides comprehensive plotting and analysis capabilities for SerDes validation results across all supported protocols.
serdes_validation_framework.visualization/
├── __init__.py # Main module exports
├── base_visualizer.py # Base visualizer class
├── eye_diagram.py # Advanced eye diagram analysis
├── protocol_visualizers.py # Protocol-specific visualizers
├── dashboard.py # Interactive dashboards
└── comparison.py # Multi-protocol comparison
Abstract base class providing common visualization functionality.
class BaseVisualizer(ABC):
"""Base class for all protocol visualizers"""
def __init__(self, protocol_name: str)
def plot_spectrum(self, signal_data: np.ndarray, sample_rate: float, **kwargs) -> Optional[str]
def plot_time_domain(self, signal_data: np.ndarray, time_axis: Optional[np.ndarray] = None, **kwargs) -> Optional[str]
def create_summary_report(self, test_results: Dict[str, Any], **kwargs) -> Optional[str]
@abstractmethod
def plot_eye_diagram(self, signal_data: Union[np.ndarray, Dict], **kwargs) -> Optional[str]
@abstractmethod
def plot_signal_quality(self, metrics: Dict[str, Any], **kwargs) -> Optional[str]matplotlib_available: bool- Whether matplotlib is availableplotly_available: bool- Whether plotly is availableseaborn_available: bool- Whether seaborn is availableprotocol_name: str- Name of the protocol
Plot frequency spectrum of signal data.
Parameters:
signal_data(np.ndarray): Signal data to analyzesample_rate(float): Sample rate in Hz**kwargs: Additional parametersfilename(str): Output filename
Returns:
Optional[str]: Path to saved plot or None if failed
Plot time domain representation of signal.
Parameters:
signal_data(np.ndarray): Signal datatime_axis(Optional[np.ndarray]): Time axis values**kwargs: Additional parameters
Returns:
Optional[str]: Path to saved plot or None if failed
Create comprehensive multi-panel summary report.
Parameters:
test_results(Dict[str, Any]): Test results data**kwargs: Additional parameters
Returns:
Optional[str]: Path to saved report or None if failed
Advanced eye diagram visualization with automatic measurements.
class EyeDiagramVisualizer(BaseVisualizer):
"""Advanced eye diagram visualization for SerDes signals"""
def __init__(self, protocol_name: str = "SerDes")
def plot_eye_diagram(self, signal_data: Union[np.ndarray, Dict], **kwargs) -> Optional[str]
def plot_signal_quality(self, metrics: Dict[str, Any], **kwargs) -> Optional[str]Create comprehensive eye diagram with measurements.
Parameters:
signal_data(Union[np.ndarray, Dict]): Signal data**kwargs: Additional parameterssymbol_rate(float): Symbol rate in Hz (default: 20e9)samples_per_symbol(int): Samples per symbol (default: 10)show_measurements(bool): Show eye measurements (default: True)title(str): Plot titlefilename(str): Output filename
Returns:
Optional[str]: Path to saved plot or None if failed
Eye Measurements Calculated:
- Eye height (V)
- Eye width (UI)
- SNR (dB)
- RMS jitter (ps)
- Crossing percentage
Enhanced USB4 visualization with tunneling and power management support.
class USB4Visualizer(BaseVisualizer):
"""Enhanced USB4 visualization"""
def __init__(self)
def plot_eye_diagram(self, signal_data: Union[np.ndarray, Dict], **kwargs) -> Optional[str]
def plot_signal_quality(self, metrics: Dict[str, Any], **kwargs) -> Optional[str]
def plot_tunnel_bandwidth(self, bandwidth_data: Dict[str, Any], **kwargs) -> Optional[str]
def plot_power_states(self, power_data: Dict[str, Any], **kwargs) -> Optional[str]
def create_interactive_dashboard(self, test_results: Dict[str, Any], **kwargs) -> Optional[str]Plot USB4 tunnel bandwidth utilization.
Parameters:
bandwidth_data(Dict[str, Any]): Bandwidth data by tunnel type{ 'PCIe': {'utilization': 75, 'max_bandwidth': 32, 'allocated_bandwidth': 24}, 'DisplayPort': {'utilization': 60, 'max_bandwidth': 20, 'allocated_bandwidth': 12}, 'USB3.2': {'utilization': 45, 'max_bandwidth': 10, 'allocated_bandwidth': 4.5} }**kwargs: Additional parameters
Returns:
Optional[str]: Path to saved plot or None if failed
Plot USB4 power state transitions and consumption.
Parameters:
power_data(Dict[str, Any]): Power state data{ 'timeline': { 'times': [0, 1, 2, 3, 4, 5], 'states': ['U0', 'U0', 'U1', 'U2', 'U0', 'U3'] }, 'consumption': { 'U0': 2.5, # Active (W) 'U1': 1.2, # Standby (W) 'U2': 0.5, # Sleep (W) 'U3': 0.1 # Deep sleep (W) } }**kwargs: Additional parameters
Returns:
Optional[str]: Path to saved plot or None if failed
Create interactive USB4 dashboard with multiple panels.
Parameters:
test_results(Dict[str, Any]): Comprehensive test results{ 'test_results': { 'eye_diagram': {'status': 'PASS'}, 'jitter': {'status': 'PASS'}, 'tunneling': {'status': 'FAIL'} }, 'signal_quality': { 'eye_height': 0.75, 'snr': 22.5, 'jitter_rms': 0.12 }, 'tunnel_bandwidth': { 'PCIe': 75, 'DisplayPort': 60, 'USB3.2': 45 }, 'power_timeline': { 'times': [0, 1, 2, 3], 'states': ['U0', 'U1', 'U0', 'U2'] } }**kwargs: Additional parametersfilename(str): Output HTML filenameheight(int): Dashboard height in pixels
Returns:
Optional[str]: Path to saved HTML dashboard or None if failed
Enhanced PCIe visualization with link training and equalization support.
class PCIeVisualizer(BaseVisualizer):
"""Enhanced PCIe visualization"""
def __init__(self)
def plot_eye_diagram(self, signal_data: Union[np.ndarray, Dict], **kwargs) -> Optional[str]
def plot_signal_quality(self, metrics: Dict[str, Any], **kwargs) -> Optional[str]
def plot_link_training(self, training_data: Dict[str, Any], **kwargs) -> Optional[str]Plot PCIe link training progression and equalization.
Parameters:
training_data(Dict[str, Any]): Link training data{ 'phases': { 'Detect': {'duration': 12, 'success': True}, 'Polling': {'duration': 24, 'success': True}, 'Configuration': {'duration': 48, 'success': True}, 'L0': {'duration': 1000, 'success': True} }, 'equalization': { 'C-1': -2, # Pre-cursor coefficient 'C0': 15, # Main cursor coefficient 'C+1': -3 # Post-cursor coefficient } }**kwargs: Additional parameters
Returns:
Optional[str]: Path to saved plot or None if failed
Enhanced 224G Ethernet visualization with PAM4 support.
class EthernetVisualizer(BaseVisualizer):
"""Enhanced 224G Ethernet visualization"""
def __init__(self)
def plot_eye_diagram(self, signal_data: Union[np.ndarray, Dict], **kwargs) -> Optional[str]
def plot_signal_quality(self, metrics: Dict[str, Any], **kwargs) -> Optional[str]
def plot_pam4_levels(self, signal_data: np.ndarray, **kwargs) -> Optional[str]Plot PAM4 level distribution and analysis.
Parameters:
signal_data(np.ndarray): PAM4 signal data**kwargs: Additional parameters
Returns:
Optional[str]: Path to saved plot or None if failed
Creates comprehensive interactive dashboards for validation results.
class ValidationDashboard:
"""Interactive validation dashboard creator"""
def __init__(self)
def create_validation_dashboard(self, results: Dict[str, Any], **kwargs) -> Optional[str]Create comprehensive validation dashboard.
Parameters:
results(Dict[str, Any]): Validation results data**kwargs: Additional parametersfilename(str): Output HTML filename
Returns:
Optional[str]: Path to saved dashboard or None if failed
Multi-protocol comparison and analysis tools.
class ProtocolComparison(BaseVisualizer):
"""Multi-protocol comparison visualizer"""
def __init__(self)
def compare_eye_diagrams(self, protocol_data: Dict[str, Any], **kwargs) -> Optional[str]
def create_performance_comparison(self, performance_data: Dict[str, Dict], **kwargs) -> Optional[str]
def plot_signal_quality(self, metrics: Dict[str, Any], **kwargs) -> Optional[str]Compare eye diagrams across multiple protocols.
Parameters:
protocol_data(Dict[str, Any]): Protocol data for comparison{ 'USB4': { 'signal': usb4_signal_data, 'params': {'symbol_rate': 20e9, 'samples_per_symbol': 10} }, 'PCIe': { 'signal': pcie_signal_data, 'params': {'symbol_rate': 32e9, 'samples_per_symbol': 8} }, 'Ethernet': { 'signal': eth_signal_data, 'params': {'symbol_rate': 112e9, 'samples_per_symbol': 4} } }**kwargs: Additional parameters
Returns:
Optional[str]: Path to saved comparison plot or None if failed
Create performance comparison across protocols.
Parameters:
performance_data(Dict[str, Dict]): Performance data by protocol{ 'USB4': {'throughput': 40, 'latency': 125, 'power': 2.5}, 'PCIe': {'throughput': 64, 'latency': 100, 'power': 3.2}, 'Ethernet': {'throughput': 224, 'latency': 50, 'power': 5.8} }**kwargs: Additional parameters
Returns:
Optional[str]: Path to saved comparison plot or None if failed
The original USB4 visualizer has been enhanced with automatic fallback to advanced features.
from serdes_validation_framework.protocols.usb4.visualization import USB4Visualizer
# Automatically uses enhanced features if available
viz = USB4Visualizer()
result = viz.plot_eye_diagram(data) # Enhanced eye diagram with measurementsfrom serdes_validation_framework.visualization import EyeDiagramVisualizer
viz = EyeDiagramVisualizer("USB4")
result = viz.plot_eye_diagram(
signal_data,
symbol_rate=20e9,
show_measurements=True,
filename='usb4_eye.png'
)from serdes_validation_framework.visualization import USB4Visualizer
viz = USB4Visualizer()
# Eye diagram
eye_result = viz.plot_eye_diagram(signal_data)
# Tunnel bandwidth
bandwidth_result = viz.plot_tunnel_bandwidth(bandwidth_data)
# Interactive dashboard
dashboard_result = viz.create_interactive_dashboard(test_results)from serdes_validation_framework.visualization import ProtocolComparison
comparison = ProtocolComparison()
# Compare eye diagrams
eye_comparison = comparison.compare_eye_diagrams(protocol_data)
# Compare performance
perf_comparison = comparison.create_performance_comparison(performance_data)All visualization methods include comprehensive error handling:
- Graceful Degradation: Falls back to basic implementations if advanced features unavailable
- Dependency Checking: Automatic detection of matplotlib, plotly, seaborn
- Input Validation: Validates signal data format and parameters
- File Management: Automatic output directory creation
- Meaningful Errors: Clear error messages for troubleshooting
numpy>=1.26.0
matplotlib>=3.9.0- For static plotsplotly>=5.17.0- For interactive dashboardsseaborn>=0.13.0- For enhanced styling
from serdes_validation_framework.visualization import (
MATPLOTLIB_AVAILABLE,
PLOTLY_AVAILABLE,
SEABORN_AVAILABLE
)- Large Datasets: Use downsampling for datasets > 100K samples
- Eye Diagrams: Limit traces to < 200 for optimal rendering
- Memory Usage: Optimized for datasets up to 1M samples
- Rendering Speed: ~0.5-2.0 seconds for typical eye diagrams
- Interactive Dashboards: ~1.0-3.0 seconds for multi-panel layouts