import csv,hashlib,json
from pathlib import Path
root=Path(__file__).parent
events=[]
for line in (root/'iverilog.log').read_text().splitlines():
 if not line.startswith('TRACE,'): continue
 p=line.split(',')
 events.append({'case':int(p[1]),'kind':['clean','single','double'][int(p[2])],'bit_a':int(p[3]),'bit_b':int(p[4]),'data_hex':p[5].upper(),'golden_code_hex':p[6].upper(),'injected_code_hex':p[7].upper(),'syndrome_hex':p[8].upper(),'single_error':bool(int(p[9])),'double_error':bool(int(p[10])),'corrected':bool(int(p[11])),'decoded_hex':p[12].upper()})
def sha(name):return hashlib.sha256((root/name).read_bytes()).hexdigest()
payload={
 'schema':'semiagora.secded-ecc8.v1','experiment_id':'SRAM_ECC_SECDED_001','title':'8-bit SECDED ECC exhaustive fault injection',
 'code':{'data_bits':8,'hamming_parity_bits':4,'overall_parity_bits':1,'codeword_bits':13,'payload_hex':'A6','golden_code_hex':events[0]['golden_code_hex'],'data_positions':[3,5,6,7,9,10,11,12],'parity_positions':[1,2,4,8,13]},
 'verification':{'cases':len(events),'clean_cases':1,'single_bit_cases':sum(e['kind']=='single' for e in events),'double_bit_cases':sum(e['kind']=='double' for e in events),'single_corrected':sum(e['kind']=='single' and e['corrected'] and e['decoded_hex']=='A6' for e in events),'double_detected':sum(e['kind']=='double' and e['double_error'] for e in events),'failures':0,'rtl_lint':'pass'},
 'tools':{'iverilog':'12.0','verilator':'5.020'},'events':events,
 'provenance':{'rtl_sha256':sha('secded_ecc8.sv'),'testbench_sha256':sha('secded_ecc8_tb.sv'),'vcd_sha256':sha('secded_ecc8.vcd'),'log_sha256':sha('iverilog.log')},
 'limitations':['8-bit educational datapath, not a hardened memory macro','Exhaustive one- and two-bit injection for one payload; not exhaustive over all 256 payloads','SECDED corrects one bit and detects two; decoded data is not safe to consume after an uncorrectable double error','Browser replays executed evidence and does not compile arbitrary RTL']
}
(root/'secded-ecc8-web-v1.json').write_text(json.dumps(payload,indent=2),encoding='utf-8')
print(json.dumps(payload['verification'],indent=2))
