PageSourceSearch

https://formal.org/assets/Kata2-2AeZoIys.js

js formal.org collected 2026-10-05 18:12:33 UTC 25,063 bytes, 5 lines download raw bytes

1import{j as e,c as oe,aa as re,r,y as ne,ac as ie}from"./index-MZHHoCdL.js";import{u as le,k as de,K as ce,a as xe,C as B,R as pe,b as V,c as ue,d as he,e as y,f as g,g as me,h as fe,i as be,B as U,j as ye}from"./BriefCallout-Bd-DJLeT.js";import{u as ge}from"./useLastActivity-NpW8O0jz.js";import{u as ve,S as X,a as je}from"./SolutionUnlockBanner-Bt68-TaD.js";import{w as G,F as $}from"./index-Cur0UWIm.js";import{u as ke}from"./useKataProgress-C9RfS1pK.js";import{K as S}from"./kata-designs-DeF7-8QF.js";import{C as we,P as Re}from"./ProofPassStrip-uObuhXXh.js";import{F as Se}from"./Figure-DlALzOWG.js";import{d as Ae}from"./dynamicFailExplanation-7cU17uh3.js";import{d as Y}from"./displayExplanation-CjuVAKN6.js";import"./ProfileNudge-CRK3lupt.js";import"./HeaderShell-D7VbrOdC.js";import"./KataUserMenu-Ctg75B_E.js";import"./kata-registry-Dl08oJln.js";import"./skeleton-CMzUsl0O.js";import"./SolversNavStrip-CRu-VHx4.js";import"./circle-check-fNACVBTZ.js";import"./index-C0zn1IP2.js";import"./chevron-right-DNyPZY9N.js";function Ne(){return e.jsx(Se,{vw:500,children:e.jsxs("svg",{viewBox:"0 0 500 282",className:"w-full h-auto text-foreground",children:[e.jsx("text",{x:"20",y:"20",fontFamily:"monospace",fontSize:"9",letterSpacing:".08em",fill:"currentColor",opacity:"0.6",children:"CORRECT AR-ACCEPTANCE — ARREADY DEASSERTS WHEN BUFFER IS FULL"}),e.jsx("line",{x1:"20",y1:"28",x2:"480",y2:"28",stroke:"currentColor",opacity:"0.3",strokeWidth:"0.5"}),e.jsx("line",{x1:"78",y1:"33",x2:"78",y2:"178",stroke:"currentColor",opacity:"0.2",strokeWidth:"0.5"}),e.jsx("text",{x:"74",y:"57",textAnchor:"end",fontFamily:"monospace",fontSize:"9",fill:"currentColor",opacity:"0.7",children:"arvalid"}),e.jsx("text",{x:"74",y:"91",textAnchor:"end",fontFamily:"monospace",fontSize:"9",fill:"currentColor",opacity:"0.7",children:"arready"}),e.jsx("text",{x:"74",y:"125",textAnchor:"end",fontFamily:"monospace",fontSize:"9",fill:"currentColor",opacity:"0.7",children:"rvalid"}),e.jsx("text",{x:"74",y:"159",textAnchor:"end",fontFamily:"monospace",fontSize:"9",fill:"currentColor",opacity:"0.7",children:"rready"}),e.jsx("path",{d:"M80,64 L120,64 L120,44 L160,44 L160,64 L260,64 L260,44 L320,44 L320,64 L460,64",fill:"none",stroke:"currentColor",strokeWidth:"1.5"}),e.jsx("path",{d:"M80,78 L160,78 L160,98 L320,98 L320,78 L460,78",fill:"none",stroke:"currentColor",strokeWidth:"1.5"}),e.jsx("path",{d:"M80,132 L160,132 L160,112 L320,112 L320,132 L460,132",fill:"none",stroke:"currentColor",strokeWidth:"1.5"}),e.jsx("path",{d:"M80,166 L275,166 L275,146 L320,146 L320,166 L460,166",fill:"none",stroke:"currentColor",strokeWidth:"1.5"}),e.jsx("line",{x1:160,y1:"34",x2:160,y2:"175",stroke:"currentColor",opacity:"0.3",strokeWidth:"0.5",strokeDasharray:"3 2"}),e.jsx("line",{x1:320,y1:"34",x2:320,y2:"175",stroke:"currentColor",opacity:"0.3",strokeWidth:"0.5",strokeDasharray:"3 2"}),e.jsx("text",{x:"140",y:"39",textAnchor:"middle",fontFamily:"monospace",fontSize:"9",fill:"currentColor",opacity:"0.6",children:"AR1"}),e.jsx("text",{x:160,y:"34",textAnchor:"middle",fontFamily:"monospace",fontSize:"9",fill:"currentColor",opacity:"0.6",children:"✓"}),e.jsx("text",{x:"290",y:"39",textAnchor:"middle",fontFamily:"monospace",fontSize:"9",fill:"currentColor",children:"AR2 (held)"}),e.jsx("text",{x:"240",y:"91",textAnchor:"middle",fontFamily:"monospace",fontSize:"9",fill:"currentColor",children:"arready = 0  ← your fix"}),e.jsx("text",{x:"240",y:"125",textAnchor:"middle",fontFamily:"monospace",fontSize:"9",fill:"currentColor",opacity:"0.6",children:"R1 in flight"}),e.jsx("text",{x:"297",y:"159",textAnchor:"middle",fontFamily:"monospace",fontSize:"9",fill:"currentColor",opacity:"0.6",children:"rready"}),e.jsx("text",{x:320,y:"34",textAnchor:"middle",fontFamily:"monospace",fontSize:"9",fill:"currentColor",opacity:"0.6",children:"✓"}),e.jsx("text",{x:"390",y:"39",textAnchor:"middle",fontFamily:"monospace",fontSize:"9",fill:"currentColor",opacity:"0.6",children:"AR2 accepted"}),e.jsx("line",{x1:"20",y1:"186",x2:"480",y2:"186",stroke:"currentColor",opacity:"0.3",strokeWidth:"0.5"}),e.jsx("text",{x:"20",y:"204",fontFamily:"monospace",fontSize:"9",letterSpacing:".08em",fill:"
1currentColor",opacity:"0.6",children:"WHAT TO FIX"}),e.jsx("text",{x:"20",y:"224",fontFamily:"monospace",fontSize:"10",fill:"currentColor",children:"In the IN-FLIGHT state, arready must depend on whether the buffer is"}),e.jsx("text",{x:"20",y:"242",fontFamily:"monospace",fontSize:"10",fill:"currentColor",children:"full. Edit the condition so the slave deasserts arready only when both"}),e.jsx("text",{x:"20",y:"260",fontFamily:"monospace",fontSize:"10",fill:"currentColor",children:"the response is stalled and a request is already buffered."})]})})}const q=ce["wb2axip-kata-2-2"],Ce=["Open design.sv and find the AR-acceptance block (the last always @(posedge S_AXI_ACLK) before the FORMAL block).","Work out the condition under which the slave has no room left to answer another read, and make arready reflect it. The design already computes signals that describe its buffer state — read them and decide which state must stop acceptance.","Run the proof and iterate. Read each counterexample: it tells you which case your condition still lets through.","The solution unlocks after 3 runs (viewing it before you solve costs 2 points) — use the diff to compare your fix against Dan's reference."],E=q.starter.properties_sv,_=q.starter.verify_sby,v=3;function qe(){oe({title:"Kata 2.2 — Fix the AR-Acceptance Logic",description:"Fix the bug in demoaxi.v's AR-acceptance state machine. Work out what the AMBA read handshake requires of the slave's AR-acceptance logic, correct the design, and watch the proof turn from FAIL to PASS.",canonical:"/wb2axip/module/2/kata/2",ogType:"article",ogImage:"/api/og/kata/wb2axip-kata-2-2",breadcrumb:[{name:"Home",url:"/"},{name:"AXI Formal Verification",url:"/wb2axip"},{name:"Module 2",url:"/wb2axip/module/2"},{name:"Kata 2.2 — Fix the AR-Acceptance Logic",url:"/wb2axip/module/2/kata/2"}]}),ge({activityType:"kata",week:2,activityId:"2.2",displayName:"Kata 2.2 · Fix the AR-Acceptance Logic",path:"/wb2axip/module/2/kata/2"});const{isDark:a}=re(),[o,i]=r.useState("design.sv"),[t,c]=r.useState(!1),[x,u]=r.useState(S["wb2axip-kata-2-2"]),[d,l]=r.useState(null),[F,p]=r.useState(!1),n=ve("wb2axip-kata-2-2","design_sv",S["wb2axip-kata-2-2"]),[T,A]=r.useState(!1),[I,Q]=r.useState(!1),{isPassing:Z,targetStatus:N,submitVerification:O,attemptCount:C,justCompleted:j,pointsEarned:P,totalPoints:D,clearCompletion:W}=le("wb2axip-kata-2-2"),{data:ee,refresh:te}=ke();r.useEffect(()=>{j&&te()},[j]);const[m,z]=r.useState(0),[K,f]=r.useState(!1),[k,w]=r.useState(!1);r.useEffect(()=>{C>0&&z(C)},[C]);const R=ee?.kataBreakdown.find(s=>s.kataId==="wb2axip-kata-2-2")??null,H=R?{earned:R.finalPoints,possible:R.possiblePoints}:null;de(d?.raw_output,x,"design.sv");const b=Z||R?.solved===!0||m>=v,L=r.useCallback(async()=>{if(!n.ref.current?.trim()){l({status:"ERROR",elapsed_seconds:0,raw_output:`design.sv is empty.
2
3Use the Reset to original button on the design.sv tab if you cleared it accidentally.`});return}const s=m+1;z(s),s===v&&!k&&f(!0),c(!0),u(n.ref.current),l(null);try{const h=await O({design_sv:n.ref.current,properties_sv:E,verify_sby:_})??{status:"ERROR",elapsed_seconds:0,raw_output:"No response from the verification backend."};l(h)}catch(h){l({status:"ERROR",elapsed_seconds:0,raw_output:`Could not reach backend.
4
5${String(h)}`})}finally{c(!1)}},[O,n,m,k]),ae=({mobile:s})=>e.jsx("button",{className:`bg-foreground text-background font-bold rounded transition-opacity ${t?"opacity-50 cursor-not-allowed":"hover:opacity-80"} ${s?"text-[11px] px-4 py-1.5":"text-[12px] px-5 py-2"}`,onClick:L,disabled:t,children:t?s?"…":"Running…":s?"Run":"Run Verification"}),se=({mobile:s})=>e.jsxs("div",{className:`border-b border-border flex items-center ${s?"":"justify-between"} px-1 shrink-0 h-[44px]`,children:[e.jsxs("div",{className:"flex items-center",children:[e.jsx("button",{className:`px-4 h-[44px] text-[13px] font-medium border-b-2 transition-colors ${o==="design.sv"?"text-foreground border-foreground":"text-muted-foreground border-transparent hover:text-foreground"}`,onClick:()=>i("design.sv"),children:"design.sv"}),n.hasDraft&&e.jsx(be,{onConfirm:n.resetDraft}),n.isSaved&&e.jsx("span",{className:"font-mono text-[10px] text-muted-foreground transition-opacity pr-2","data-testid":"text-saved-indicator",children:"Saved"}),e.jsxs("button",{className:`px-4 h-[44px] text-[13px] font-medium border-b-2 transition-colors ${o==="properties.sv"?"text-foreground border-foreground":"text-muted-foreground border-transparent hover:text-foreground"}`,onClick:()=>i("properties.sv"),children:["properties.sv ",e.jsx("span",{className:"text-[10px] text-muted-foreground ml-1",children:"read-only"})]}),e.jsxs("button",{className:`px-4 h-[44px] text-[13px] font-medium border-b-2 transition-colors ${o==="verify.sby"?"text-foreground border-foreground":"text-muted-foreground border-transparent hover:text-foreground"}`,onClick:()=>i("verify.sby"),children:["verify.sby ",e.jsx("span",{className:"text-[10px] text-muted-foreground ml-1",children:"read-only"})]}),e.jsx("button",{className:`px-4 h-[44px] text-[13px] font-medium border-b-2 transition-colors ${o==="solution"?"text-foreground border-foreground":b?"text-muted-foreground border-transparent hover:text-foreground cursor-pointer":"text-muted-foreground border-transparent cursor-not-allowed"}`,onClick:()=>{b&&o!=="solution"&&p(!0)},title:b?void 0:"Run more times to unlock the solution",children:b?"solution":e.jsxs(e.Fragment,{children:[e.jsx(ne,{className:"w-3 h-3 inline mr-1"}),"solution"]})})]}),!s&&e.jsx("div",{className:"flex items-center gap-3 pr-3",children:e.jsx(ae,{})})]}),M=()=>e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"font-mono text-[11px] uppercase tracking-widest text-muted-foreground mb-3",children:"Kata 2.2 — Guided"}),e.jsx("h2",{className:"text-lg font-bold tracking-tight mb-4",children:"Fix the AR-Acceptance Logic"}),e.jsx("h3",{className:"text-[15px] font-semibold tracking-tight mb-2",children:"What is an AXI-Lite read channel?"}),e.jsxs("div",{className:"text-[15px] leading-[1.75] text-foreground space-y-3 mb-4",children:[e.jsxs("p",{children:["An AXI-Lite read channel is the half of a memory-mapped bus that carries reads from a master to a slave. It runs on two handshakes: the master puts a read address on the AR channel (",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"arvalid"}),"/",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"arready"}),"/",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"araddr"}),"), and the slave later returns the data on the R channel (",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"rvalid"}),"/",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"rready"}),"/",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"rdata"}),"). Each handshake completes on the cycle both its valid and ready are high — like ordering at a counter, then collecting the dish once it is ready."]}),e.jsxs("p",{children:["For every AR the slave accepts, it owes exactly one R response. A pipelined slave may accept a new address while a previous response is still in flight — but only if it back-pressures by dropping ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"arready"})," when its buffers are full. This is the read half of ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"demoaxi.v"}),", the same buggy design as Kata 2.1; here your job is to repair the AR-acceptance logic so it back-pressures correctly and the proof passes."]})]}),e.jsx("div",{className:"text-[15px] leading-[1.75] text-foreground space-y-3 mb-6",children:e.jsxs("p",{children:["Same design and bug as Kata 2.1 — this time you fix it. The AR-acceptance block currently keeps ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"arready"})," permanently asserted: the slave never refuses a read, whatever it is already holding. Your job is to work out when it genuinely has no room left, and make ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"arready"})," say so."]})}),e.jsxs("div",{className:"border border-border rounded p-4 text-[13px] leading-relaxed text-foreground
5/80 mb-6",children:[e.jsx("span",{className:"font-mono text-[11px] uppercase tracking-widest text-muted-foreground block mb-2",children:"Specification"}),"The ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"faxil_slave_read"})," property suite (on the properties.sv tab) checks these AMBA read-channel rules — a correct fix must satisfy all of them:",e.jsx("div",{className:"border border-border overflow-hidden mt-3",children:e.jsx("table",{className:"w-full text-[13px]",children:e.jsx("tbody",{children:[{rule:"R stability",desc:"Once RVALID is asserted, it must stay asserted (with stable RDATA, RRESP) until RREADY arrives."},{rule:"RRESP is OKAY",desc:"AXI-Lite slaves return RRESP=2'b00. Other values are not allowed."},{rule:"Reset clean",desc:"RVALID must not be asserted on the first cycle after reset deasserts."},{rule:"Outstanding bound",desc:"The slave may only keep as many read transactions in flight as it has buffers for — one response in progress plus one pre-buffered address. Accepting more than it can hold is exactly what the AR-acceptance bug does."}].map((s,h)=>e.jsxs("tr",{className:h<3?"border-b border-border":"",children:[e.jsx("td",{className:"px-3 py-2.5 font-mono text-[12px] font-semibold text-foreground whitespace-nowrap align-top",style:{width:130},children:s.rule}),e.jsx("td",{className:"px-3 py-2.5 text-foreground/70",children:s.desc})]},h))})})})]}),e.jsx("div",{className:"border-t border-border mb-6"}),e.jsx(U,{label:"Your task",children:e.jsxs("ol",{className:"list-decimal pl-5 space-y-2 text-[14px] leading-relaxed mb-0",children:[e.jsxs("li",{children:["Open ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"design.sv"})," and find the AR-acceptance block (the last ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"always @(posedge S_AXI_ACLK)"})," before the FORMAL block)."]}),e.jsxs("li",{children:["Work out the condition under which the slave has no room left to answer another read, and make ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"arready"})," reflect it. The design already computes signals that describe its buffer state — read them and decide which state must stop acceptance."]}),e.jsx("li",{children:"Run the proof and iterate. Read each counterexample: it tells you which case your condition still lets through."}),e.jsx("li",{children:"The solution unlocks after 3 runs (viewing it before you solve costs 2 points) — use the diff to compare your fix against Dan's reference."})]})}),e.jsx(U,{label:"Goal",testId:"goal-line",children:e.jsx("p",{className:"text-[13.5px] leading-[1.55] text-foreground m-0",children:"The design is broken and design.sv is yours to edit: you fix the RTL, not the properties. A passing proof means you are done."})}),e.jsx("div",{className:"border-t border-border mb-6"}),e.jsx("p",{className:"font-mono text-[11px] uppercase tracking-widest text-muted-foreground mb-3",children:"The Design — demoaxi.v (read-channel slice)"}),e.jsx("div",{className:"my-5",children:e.jsx(Ne,{})}),e.jsx("div",{className:"text-[14px] leading-[1.75] text-foreground/80 space-y-3 mb-5",children:e.jsxs("p",{children:["A 64-register AXI-Lite slave. Trimmed to the read channel only — the write channel comes in Module 3. The AR-acceptance block is the last ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"always @(posedge S_AXI_ACLK)"}),"block before the FORMAL block; the properties.sv tab holds ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"faxil_slave_read"}),", the trimmed reference property suite from ",e.jsx("code",{className:"font-mono bg-muted px-1 text-[12px]",children:"bench/formal/faxil_slave.v"})," in wb2axip."]})}),e.jsxs("div",{className:"border border-border rounded p-4 text-[13px] leading-relaxed text-foreground/70",children:[e.jsx("span",{className:"font-mono text-[11px] uppercase tracking-widest text-muted-foreground block mb-2",children:"Hint"}),'Kata 2.1 showed you the symptom: the slave accepted a read it had nowhere to put. The AR-acceptance block is the only place that decides whether a read is taken — read what it actually checks before saying yes, against the buffer state the module already tracks around it. It is not consulting that state at all. Work out which combination of it means "full", and the buffered-handshake strategy in section 03 of the lesson will look familiar.']})]});return e.jsxs("div",{className:`h-screen [height:100dvh] flex flex-col bg-background overflow-hidden${a?" kata-dark":""}`,children:[e.jsx(xe,{moduleNumber:2,kataNumber:2,course:"wb2axip",kataId:"wb2axip-kata-2-2",badge:"Guided",attemptCount:m,unlockThreshold:v}),e.jsxs("div",{className:"hidden lg:block shrink-0",children:[j&&e.jsx(B,{pointsEarned:P,totalPoints:D,onDismiss:W}
5),K&&!k&&e.jsx(X,{onViewSolution:()=>{f(!1),w(!0),p(!0)},onDismiss:()=>{f(!1),w(!0)}})]}),e.jsx(je,{kataId:"wb2axip-kata-2-2",open:F,onConfirm:()=>{p(!1),i("solution"),Q(!0),A(!0)},onCancel:()=>p(!1)}),e.jsx("div",{className:"hidden lg:flex flex-1 min-h-0",children:e.jsxs(pe,{direction:"horizontal",className:"h-full w-full",children:[e.jsx(V,{defaultSize:38,minSize:15,maxSize:60,children:e.jsx("div",{className:"h-full border-r border-border overflow-x-hidden overflow-y-auto",children:e.jsx("div",{className:"p-6",children:e.jsx(M,{})})})}),e.jsx(ue,{direction:"horizontal"}),e.jsx(V,{children:e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(se,{}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(he,{editor:o==="solution"?e.jsx(G,{keepCurrentOriginalModel:!0,keepCurrentModifiedModel:!0,original:x,modified:S["wb2axip-kata-2-2-solution"],language:"systemverilog",beforeMount:g,theme:a?"formal-bw-dark":"formal-bw",options:{...y,readOnly:!0,renderSideBySide:!0,enableSplitViewResizing:!1}}):o==="design.sv"?e.jsx($,{defaultLanguage:"systemverilog",defaultValue:n.ref.current,beforeMount:g,theme:a?"formal-bw-dark":"formal-bw",onChange:n.onChange,options:y},n.resetKey):o==="properties.sv"?e.jsx($,{defaultLanguage:"systemverilog",defaultValue:E,beforeMount:g,theme:a?"formal-bw-dark":"formal-bw",options:{...y,readOnly:!0}},"properties.sv"):e.jsx($,{defaultLanguage:"ini",defaultValue:_,beforeMount:g,theme:a?"formal-bw-dark":"formal-bw",options:{...y,readOnly:!0}}),output:e.jsx(Le,{onRetry:L,onClear:()=>l(null),isRunning:t,result:d,scoreInfo:H,targetStatus:N})})})]})})]})}),e.jsx(me,{courseId:"wb2axip",kataId:"wb2axip-kata-2-2",header:e.jsx(fe,{moduleNumber:2,kataNumber:2,course:"wb2axip",kataId:"wb2axip-kata-2-2",badge:"Guided"}),banners:e.jsxs(e.Fragment,{children:[j&&e.jsx(B,{pointsEarned:P,totalPoints:D,onDismiss:W}
5),K&&!k&&e.jsx(X,{onViewSolution:()=>{f(!1),w(!0),p(!0)},onDismiss:()=>{f(!1),w(!0)}})]}),brief:e.jsx(M,{}),taskSteps:Ce,files:[{name:"design.sv",language:"systemverilog",editable:!0,draft:n},{name:"properties.sv",language:"systemverilog",editable:!1,value:E},{name:"verify.sby",language:"ini",editable:!1,value:_}],onRun:L,isRunning:t,result:d,onClearResult:()=>l(null),targetStatus:N,explanation:Y(d,J(d,N)),scoreInfo:H,solution:{mode:"modal",locked:!b,unlockRemaining:v-m,unlockThreshold:v,viewed:I,onReveal:()=>p(!0)}}),T&&e.jsxs("div",{className:"lg:hidden fixed inset-0 z-50 flex flex-col bg-background overflow-hidden",children:[e.jsxs("div",{className:"shrink-0 border-b flex items-center justify-between px-4 h-[52px]",children:[e.jsx("span",{className:"font-mono text-[13px] font-medium text-foreground",children:"solution diff"}),e.jsx("button",{className:"font-mono text-[13px] text-muted-foreground hover:text-foreground px-2 py-1",onClick:()=>A(!1),children:"Close"})]}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(G,{keepCurrentOriginalModel:!0,keepCurrentModifiedModel:!0,original:x,modified:S["wb2axip-kata-2-2-solution"],language:"systemverilog",beforeMount:g,theme:a?"formal-bw-dark":"formal-bw",options:{...y,readOnly:!0,renderSideBySide:!1,enableSplitViewResizing:!1}})})]})]})}function J(a,o){return a?.status==="ERROR"&&((a?.raw_output??"").startsWith("design.sv is empty")||(a?.raw_output??"").startsWith("verify.sby is empty")||(a?.raw_output??"").startsWith("properties.sv is empty"))?null:a?.status==="PASS"?"PASS — your fix to the AR-acceptance block holds across all reachable states within the depth bound. Before declaring victory, ask: did you make arready depend on the right combination of signals? A weaker fix (e.g. always deasserting arready) would also pass this proof but break performance. View the solution diff to compare your fix against Dan's reference, which deasserts arready only when both the response is stalled and a request is already buffered.":a?.status==="FAIL"?o==="PASS"?Ae(a):"FAIL — the proof still finds a counterexample. Either your fix has not yet addressed the AR-acceptance logic, or it is not yet correct. Read the trace: which property fired? Which signals are the solver driving? Compare the failure cycle to the AR-acceptance block in design.sv.":a?.status==="TIMEOUT"?"Transient timeout. Click Retry.":a?.status==="ERROR"?ye(a?.raw_output,"design.sv","Parse or elaboration error. Check the output — most likely a syntax issue introduced while editing the AR-acceptance block."):null}function Le({onRetry:a,onClear:o,isRunning:i,result:t,scoreInfo:c,targetStatus:x}){const u=t?.status==="PASS"?"#22c55e":t?.status==="FAIL"?x==="PASS"?"#ef4444":"#22c55e":t?.status==="TIMEOUT"||t?.status==="ERROR"?"#f97316":void 0,d=t?.status==="ERROR"&&((t?.raw_output??"").startsWith("design.sv is empty")||(t?.raw_output??"").startsWith("verify.sby is empty")||(t?.raw_output??"").startsWith("properties.sv is empty")),l=Y(t,J(t,x));return e.jsxs("div",{className:"h-full flex flex-col bg-[#0A0A0A] text-white overflow-hidden relative",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 pt-3 pb-2 shrink-0",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"font-mono text-[11px] uppercase tracking-widest text-neutral-400",children:"Output"}),t&&!d&&e.jsx("span",{className:"font-mono text-[11px] font-bold px-2 py-0.5 rounded",style:{color:u,border:u?`1px solid ${u}`:void 0},children:t.status}),i&&e.jsx("span",{className:"font-mono text-[11px] text-neutral-400 animate-pulse",children:"running…"})]}),e.jsx("button",{className:"text-muted-foreground text-[12px] hover:text-neutral-300",onClick:o,children:"Clear"})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto min-h-0",children:[l&&e.jsxs("div",{className:"bg-[#111] px-4 py-3 border-b border-[#333]",children:[e.jsx("span",{className:"font-mono text-[11px] uppercase tracking-widest text-neutral-300 block mb-2",children:"What happened"}),e.jsx("p",{className:"text-[13px] text-[#d0d0d0] leading-relaxed",children:l})]}),t?.status==="FAIL"&&t.trace&&e.jsx("div",{className:"p-3",children:e.jsx(we,{trace:t.trace,failureCycle:t.failure_cycle,vcdBase64:t.vcd_base64,vcdTruncated:t.vcd_truncated,engine:t.engine,depthReached:t.depth_reached,assertion:t.assertion})}),t?.status==="PASS"&&e.jsx("div",{className:"p-3",children:e.jsx(Re,{engine:t.engine,depthReached:t.depth_reached,elapsedSeconds:t.elapsed_seconds})}),e.jsxs("div",{className:"px-4 pb-4 font-mono text-[13px] leading-relaxed",children:[i&&!t&&e.jsxs("div",{className:"text-[#888]",children:[e.jsx("p",{children:"> Submitting…"}),e.jsx("p",{className:"animate-pulse",children:"> Running — 5–15 seconds"})]}),!i&&!t&&e.jsxs("div",{className:"text-[#888]",children:[e.jsx("p",{children:"> Click Run Verification to start."}),e.jsx("p",{children:">"}),e.jsx("p",{children:"> Edit the AR-acceptance block first."}),e.jsx("p",{children:"> A PASS is the goal."})]}),t&&t.status!=="FAIL"&&t.status!=="PASS"&&(d?e.jsx("div",{className:"text-[13px] text-neutral-300 leading-relaxed whitespace-pre-wrap",children:t.raw_output??""}):e.jsx("pre",{className:"whitespace-pre-wrap text-[#e8e8e8] text-[13px]",children:t.raw_output??""}))]})]}),c&&c.earned>0&&e.jsx("div",{className:"px-4 py-1.5 shrink-0",children:e.jsx("span",{className:"font-mono text-[12px] text-neutral-400",children:"Your score: "+c.earned+" / "+c.possible+" pts"})}),e.jsxs("div",{className:"flex justify-between items-center px-4 py-2 shrink-0 border-t border-[#1a1a1a]",children:[e.jsx("div",{children:t?.status==="TIMEOUT"&&e.jsx("button",{className:"text-neutral-400 text-[12px] hover:text-neutral-100 font-mono border border-[#333] px-3 py-1 rounded",onClick:a,children:"↺ Retry"})}),e.jsx("div",{})]}),e.jsx(ie,{variant:"panel",logoHeight:14})]})}
5export{qe as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.