hchevva commited on
Commit
3317675
·
verified ·
1 Parent(s): d4c36f7

Upload eda_translator.py

Browse files
Files changed (1) hide show
  1. quread/eda_translator.py +148 -0
quread/eda_translator.py ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Dict, List, Any
5
+
6
+ import numpy as np
7
+
8
+
9
+ @dataclass
10
+ class EDATranslatorConfig:
11
+ warning_threshold: float = 0.45
12
+ critical_threshold: float = 0.70
13
+ max_timing_derate: float = 1.15
14
+ base_guardband_mv: float = 5.0
15
+ max_guardband_mv: float = 60.0
16
+
17
+
18
+ def _clip01(v: float) -> float:
19
+ return float(np.clip(float(v), 0.0, 1.0))
20
+
21
+
22
+ def _tier(risk: float, cfg: EDATranslatorConfig) -> str:
23
+ if risk >= float(cfg.critical_threshold):
24
+ return "CRITICAL"
25
+ if risk >= float(cfg.warning_threshold):
26
+ return "WARNING"
27
+ return "OK"
28
+
29
+
30
+ def build_eda_mapping(
31
+ metrics: Dict[str, np.ndarray],
32
+ *,
33
+ cfg: EDATranslatorConfig | None = None,
34
+ ) -> List[Dict[str, Any]]:
35
+ cfg = cfg or EDATranslatorConfig()
36
+ required = [
37
+ "composite_risk",
38
+ "gate_error",
39
+ "readout_error",
40
+ "decoherence_risk",
41
+ "fidelity",
42
+ ]
43
+ for key in required:
44
+ if key not in metrics:
45
+ raise ValueError(f"Missing required metric: {key}")
46
+
47
+ n = int(len(metrics["composite_risk"]))
48
+ rows: List[Dict[str, Any]] = []
49
+ for q in range(n):
50
+ risk = _clip01(float(metrics["composite_risk"][q]))
51
+ gate_error = _clip01(float(metrics["gate_error"][q]))
52
+ readout_error = _clip01(float(metrics["readout_error"][q]))
53
+ decoherence_risk = _clip01(float(metrics["decoherence_risk"][q]))
54
+ fidelity = _clip01(float(metrics["fidelity"][q]))
55
+
56
+ tier = _tier(risk, cfg)
57
+ timing_derate = 1.0 + risk * (float(cfg.max_timing_derate) - 1.0)
58
+ guardband_mv = float(cfg.base_guardband_mv) + risk * (
59
+ float(cfg.max_guardband_mv) - float(cfg.base_guardband_mv)
60
+ )
61
+ route_priority = "HIGH" if tier == "CRITICAL" else ("MEDIUM" if tier == "WARNING" else "LOW")
62
+
63
+ rows.append(
64
+ {
65
+ "qubit": q,
66
+ "tier": tier,
67
+ "composite_risk": risk,
68
+ "gate_error": gate_error,
69
+ "readout_error": readout_error,
70
+ "decoherence_risk": decoherence_risk,
71
+ "fidelity": fidelity,
72
+ "timing_derate": float(timing_derate),
73
+ "guardband_mv": float(guardband_mv),
74
+ "route_priority": route_priority,
75
+ }
76
+ )
77
+
78
+ rows.sort(key=lambda r: r["composite_risk"], reverse=True)
79
+ return rows
80
+
81
+
82
+ def to_synopsys_tcl(mapping_rows: List[Dict[str, Any]]) -> str:
83
+ out = []
84
+ out.append("# ------------------------------------------------------------")
85
+ out.append("# Generated by Quread: Quantum reliability -> Synopsys TCL")
86
+ out.append("# Placeholder variable names; adapt to your flow objects.")
87
+ out.append("# ------------------------------------------------------------")
88
+ out.append("")
89
+ out.append("set quread_risk_rows {}")
90
+ out.append("")
91
+
92
+ for row in mapping_rows:
93
+ q = int(row["qubit"])
94
+ tier = row["tier"]
95
+ risk = float(row["composite_risk"])
96
+ derate = float(row["timing_derate"])
97
+ gb = float(row["guardband_mv"])
98
+ route = row["route_priority"]
99
+ out.append(f"# q{q}: tier={tier} risk={risk:.4f} route={route}")
100
+ out.append(f"set quread_q{q}_risk {risk:.6f}")
101
+ out.append(f"set quread_q{q}_tier {tier}")
102
+ out.append(f"set quread_q{q}_timing_derate {derate:.6f}")
103
+ out.append(f"set quread_q{q}_guardband_mv {gb:.3f}")
104
+ out.append(
105
+ f"lappend quread_risk_rows [list q{q} $quread_q{q}_risk $quread_q{q}_tier $quread_q{q}_timing_derate $quread_q{q}_guardband_mv {route}]"
106
+ )
107
+ out.append("")
108
+
109
+ out.append("# Example integration hook:")
110
+ out.append("# foreach row $quread_risk_rows {")
111
+ out.append("# lassign $row q risk tier derate guardband route")
112
+ out.append("# # apply derate/guardband to path groups or physical regions")
113
+ out.append("# }")
114
+ out.append("")
115
+ return "\n".join(out) + "\n"
116
+
117
+
118
+ def to_cadence_skill_reliability(mapping_rows: List[Dict[str, Any]]) -> str:
119
+ out = []
120
+ out.append("; ------------------------------------------------------------")
121
+ out.append("; Generated by Quread: Quantum reliability -> Cadence SKILL")
122
+ out.append("; Placeholder object bindings; map to your layout DB conventions.")
123
+ out.append("; ------------------------------------------------------------")
124
+ out.append("")
125
+ out.append("qureadRiskRows = nil")
126
+ out.append("")
127
+
128
+ for row in mapping_rows:
129
+ q = int(row["qubit"])
130
+ tier = row["tier"]
131
+ risk = float(row["composite_risk"])
132
+ derate = float(row["timing_derate"])
133
+ gb = float(row["guardband_mv"])
134
+ route = row["route_priority"]
135
+ out.append(
136
+ f'qureadRiskRows = cons(list("q{q}" {risk:.6f} "{tier}" {derate:.6f} {gb:.3f} "{route}") qureadRiskRows)'
137
+ )
138
+
139
+ out.append("")
140
+ out.append("qureadRiskRows = reverse(qureadRiskRows)")
141
+ out.append("")
142
+ out.append("; Example integration hook:")
143
+ out.append("; foreach(row qureadRiskRows")
144
+ out.append('; printf("Qubit=%s risk=%L tier=%s derate=%L guardband(mV)=%L route=%s\\n"')
145
+ out.append("; car(row) cadr(row) caddr(row) cadddr(row) car(cddddr(row)) cadr(cddddr(row)))")
146
+ out.append("; )")
147
+ out.append("")
148
+ return "\n".join(out) + "\n"