From 0b5583a5c0f631555aaddf3306db10827cdd7932 Mon Sep 17 00:00:00 2001 From: bowei Date: Mon, 10 Aug 2026 20:17:42 +0800 Subject: [PATCH] =?UTF-8?q?sync:=20WIN-BOWEI=202026-08-10=20=E7=A1=AC?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E5=AE=A1=E8=AE=A1=EF=BC=9A=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=20flow=20driver=20=E7=9A=84=E5=B7=A5=E7=A8=8B=E6=A0=B9?= =?UTF-8?q?=E6=94=B9=E8=AF=BB=20skills=5Fenv.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - run_fpga_local.py: FPGA_FLOW_ROOT 写死 E:\LangGraph_Design\fpga-goldenref-flow -> _env_lookup(FPGA_GOLDENREF_ROOT),未配置时给出明确提示。 - run_imx6_flow.py: DEFAULT_PROJECT 写死 -> _env_lookup(FPGA_IMX6_FLOW_ROOT), --project-dir 为空时报错而不是拿错路径继续。 与 sim-rtl-flow / zynq-imx6-flow 已有写法一致。 Co-Authored-By: Claude Opus 5 (1M context) --- .../run_fpga_local.cpython-311.pyc | Bin 16925 -> 18735 bytes fpga-goldenref-flow/scripts/run_fpga_local.py | 30 ++++++++++++++++- fpga-imx6-flow/scripts/run_imx6_flow.py | 31 +++++++++++++++++- 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/fpga-goldenref-flow/scripts/__pycache__/run_fpga_local.cpython-311.pyc b/fpga-goldenref-flow/scripts/__pycache__/run_fpga_local.cpython-311.pyc index 106e44b6326c3eca3187753fbfd8de3bae9bf51a..df9663ad909f75cd9aaf926a72a0b3a3d49207f3 100644 GIT binary patch delta 4023 zcmahLTWlQFb!KN~-|M%X^?Mw96V}PvG{z-yoQJ`NLJ~WQfhcamX0rFLJoDIr zEL)iuY?NOG6JK92ljAvJ>$OI(CfzM?oZGl27H3cLTZNj)qKCllgaOOk7n^~4f=hA6 zTkA@U2P^!>oGagB8?iAMy-5F0U84U9Nb8$Cc(>%t` z%Cd}BP|u|*7A)tu2960lw};cjL)>9u4|j+k;d{BDd-#K0R3Y-Vu03*;CE{{wfXY3+ zGS!AumeAr#BDW~eDn zn&cfyWB?dKu|!0P$w?(OpvwxQvPOp}lLr(=A_+nX2#^)o+PqQLDYc}bCAt!)@&Jt` zfg5-0L`-W|*{Z3*3U%m>31`f17( z(F;=?OsJaariYV?M$$TErkF@l&9pIUN^vEXi42%_sz;P0%==j)oirsq1tyzrJ*BXe zenwb$@%gh zzxS!`@$TnZCcU*&-rCWwX@_@~p?1>KG3DtP?VPo_B;QqE;Y7ok6_h5B=O=ks7P|G(>jN&oIC|LzHCy4XL<359{_s=61qJ-_WN|C8=h z-5*umdZp^t$*OfzRqH0YrdL#fnWcd<_kR>5Sa|LO$FL4;&g4pbKd8?vp##q z1)9NSv!n_Qa>}zVYwhKL6R9Z_k`Mdt)(U8Obv*zc4d?1}gI=@}VEJqx3xa zlUGJ(zW>grC*PQP_u0*cC|%CfgXZBCP4lIjI26{YuB!>HX;4pS=Ok7N>t>!M^sena zyDfVe-m6yjGrZ2u*;oT|i3b$ej8}pzvl^uM7NmuvYK*cqK-&W2i`xKdXWO|xcL>O`Kk2tvlM9Uo+vgt#4mDOpV{D3~tbg`OE! zNzN=gVJftL05Bi9gfgs z3Jx?V`5G{~F(7e4XD`gTd0V16F1F$e?>?nE` zHvFS#BQG($5RE{|E%tr5=Ru>lB*@noM@!131Q2xNWXU-2t||@N%2+v2OfS{+G^1ff zkErT>tj&0F#cQ3&%Qhjf;x6GS>ufLb+pWf}GcQbnE|yb+oCgsMBG3?g&lvaDgX%Z@ zWl{zR$Fjfohj}pssPUnzEPF>qlrLY*yJHo> zs9I8Y0G2a(-ey-M4mF0?JbND2&SwLwui7X!!lh2IP%W0V1Gt36n9CcHoj`n1p($d| z)G+|4C)YXh!;I>Q7<7+ZJ7T9{`I6D!_y`{|UaBk43Tt9Eh*2`M3Sx93)Op}V6pCDy zv&>Rzskaiw$><;yHzn+4WWm~*_a3ny0|+{Ec3E;3TUzcoF&gZQv8k!L%&I{*h5!sq z$0>Ua);`Q8n*^aBb1LY#!3b1+Q(aO{*G<%Xvy*sH6|{(ys--DA2Lk_=HNW+Ddp#EL zus0M+q*KXsDg-IO@C=5Xq0sy}zheAleJfvXlx|qfJB>{ns_g{rX)yM0xR-CszP{l{ zeC9k*Om~v0S}Ke$(Hru<0NbSo4_G}6L+#htFL3*I1bFb4=axmLyZ4BmqVcZ7YAP3a zbUf%b`J^f6=>w)Msl#9}B00xVk}1%`#(Ntp3#^ce*qGVxfd0?y=Nk_RcXS7N%c0;( z(-97nL?j%}U7Ure+bU1&Ps~8@D+GAASkFIp3u5mX6I*IBy@+D-%9X8E4R{gd5)$ho zmj_lxByeh#{}^K92rO5vyuy>V{I$$9o#C(s4|p)k3M)1@D|fFu+v5q6j?vBRL(au< z*zEPSHsjk{Yj~HjeQWEsA|75$%fVW%sCuIEa`n2&!j`GRmeIUvN9iml^7d(W$??Wn g8}I7kuL*+3{v`(h9*&ZI*2#%Q*&l43$Timg0($cl@c;k- delta 2451 zcmZuyTWl0n7@paky>`33mu}0pD+S6Ri=b31B9yzK+@xGf$z;0c>~_lT%y?$Dg&M8V zDhWmfkH#2*7#|SAg9-aU!UH}S9(=>Z2RsI2d^0}rVhl0H|3A~xhA_!|IcLs){_FSu z^WCTF_g^RYPti7A zrLn6aMY#cQ@Tf{ip-FhviMsi3L?e-l|7B-Vq?5#GJ&Du$qDB(4k&*PGeR5VCX&`m8 z%19%~rDoNUCQ=W(W|9VMAq{}7q!F->^75my!;^ zEbS(l)1l?)4@-e>*{iU+G4GzDDkL;4U%jh#M?DeNr~7tp9NlZ$rQOVQ$BiA-vr6`8 z(Jh(zl2azsX0(_umYpfynYyP&_+P2+ArbL>X1OB0>)`IK#;&~wjv0pz95^gOjwdwN z^v8uZ;aK+d5Q~Ckp^cdy^)PR_+@qoG8%K|LlzF3L&J?xy{>0|idIQcq%dw53Ri>;N zBzyVE`d`7^OX=)$3D~m+fH@tk3DzQRkTC;|v3A(5LYWqXR(?5?;g`}kXC6hWelb6A zT@`U^7aU^QB@rn*1+%P&MFK8TlNc5WoQx7?O;V<7LUUY*8l8YJJjWIqsa9M)%(AFn zMx++KFl=(UT;NN}GbibM5UdxD@`_UXp}`7u{Hfxt3_>S>o|KwditlLd-P(hna{xjs zJ0<}esGij$ECYDL3d%gT0v43#YuB2ugl3+DrAV8uyS8Flwo$@LvUT_|=Dkt2eENcj z6&%~91z#o$>PP*mD-t`;6sYS%;`K;i88rnrHM{_V5E%0!@EL-g4>xLzRjo2%ufXS5 z6@}kzd#Gmlt@e%Gm?94&o=Z&305wIc#0KHp9^SB|TWzhaT|!iK1?L?r(jw{kCiA^1 z3(BGM?>qWiWN~8#FpQcNb^z|}=dsM^aPM;F6*VRzlV-U}`Gd|?(LHd;hIn0<-Xm|d z7*IJZvtijjWvuG@9y$M|s9dC>4%ml5g|F+z)Gwd{)&wY@5%hUpb7>o8lvhr7Ss zf$~g8$N`857T;s9;W{c!dm>z-zMf!#d6YbXa2#P2VS;b&>0K&aYBXF1&MY{@9FQ2R zz13r=S}QF1#TVOaf9Hy7<}pX6>yjsjkL=sG_0Wk^Np!2aY|}^z6-#2IaV7aK>4UBc z4Y@o=A1HdYQZd=tr%(twZQPkM<^_CIRjcd$FdSWhOM_opnN{E5w^#PeEaU+_W~&jN z1rVA|&-g%C3rZvvV5_hN|IjrNWwhc3T4NmdQ500D|sTu%qhdE`a!24 z(}UPvM%l1syIxG;xAVz1S@=Yu0=?>g!KQ9Qz?W~Tvk zjh(}_j1O%I4QHf>X~BfCCa$h;i+lvzYrJdyyFl(M>)#JShL&$w2^kvNuw(2KRDcpP zR3;5bQ<5@qMkin(P{KY%5p1-D*x3iL)#HH=Qjd&Rdb0;5F=%#yKirUQm*FNcTt3BXrS7pxmmVVXbKW^z$`}o5x*}B(3Kqh&5kUujxz}F4NqmNYV zx|%WgnR@&ZoQq`8!{fB" + ) if FPGA_FLOW_ROOT not in sys.path: sys.path.insert(0, FPGA_FLOW_ROOT) diff --git a/fpga-imx6-flow/scripts/run_imx6_flow.py b/fpga-imx6-flow/scripts/run_imx6_flow.py index 7d9ab29..694558a 100644 --- a/fpga-imx6-flow/scripts/run_imx6_flow.py +++ b/fpga-imx6-flow/scripts/run_imx6_flow.py @@ -19,6 +19,7 @@ from __future__ import annotations import argparse import json import os +import re import sys from pathlib import Path @@ -27,7 +28,30 @@ try: except Exception: pass -DEFAULT_PROJECT = r"E:\LangGraph_Design\FPGA-imx6-flow" + +def _env_lookup(key: str, default: str | None = None) -> str | None: + """Read KEY from the OS environment, else from a ``KEY = value`` line in + ~/skills_env.md. Machine-local paths are never hardcoded in a skill; see + the same helper in fpga_flash/scripts/vivado_env.py.""" + value = os.environ.get(key) + if value: + return value + path = os.path.join(os.path.expanduser("~"), "skills_env.md") + try: + with open(path, encoding="utf-8") as handle: + for line in handle: + match = re.match(rf"\s*{re.escape(key)}\s*=\s*(.+?)\s*(?:#.*)?$", line) + if match: + found = match.group(1).strip() + if found and not found.startswith("<"): + return found + except OSError: + pass + return default + + +# The fpga-imx6-flow checkout: FPGA_IMX6_FLOW_ROOT in ~/skills_env.md. +DEFAULT_PROJECT = _env_lookup("FPGA_IMX6_FLOW_ROOT", "") def _emit(obj: dict, code: int) -> None: @@ -57,6 +81,11 @@ def main() -> None: ap.add_argument("--max-hw-retry", type=int, default=3) args = ap.parse_args() + if not args.project_dir: + _emit({"status": "error", + "error": "fpga-imx6-flow 工作流仓库路径未配置:在 ~/skills_env.md 增加 " + "FPGA_IMX6_FLOW_ROOT = <检出目录>,或用 --project-dir 显式指定"}, 1) + project = Path(args.project_dir) if not (project / "app" / "main_graph.py").exists(): _emit({"status": "error",