扩充内置功能块为 8 个:TON/TOF/TP/CTU/CTD/CTUD/R_TRIG/F_TRIG。
- isa:CAL_* 操作码连续占 24..31(CALL/RET 后移为 32/33,kOpCount=34);disasm 支持 5 个新操作码 - 词法/语法/链接:新 8 个关键字与冻结布局(TP=in/pt/q/et、CTD=cd/ld/pv/q/cv、 CTUD=cu/cd/r/lu/pv/qu/qd/cv、R_TRIG/F_TRIG=clk/q) - VM:do_cal 全 8 个语义(TP 脉冲、CTD 递减、CTUD 双向+装载、R_TRIG 上升沿、F_TRIG 下降沿); edge_prev_ 每槽 2 字节存边沿上次输入;exec_one 分发补 5 个新操作码 - 验证:TP 30ms 脉冲 2 周期、CTD 装载+递减到 q=1、CTUD cu/cd 双向、R/F_TRIG 交替; ctest 11/11 全绿 - 文档:指令与映像/词法/初步计划/符号表与链接/指令执行/扫描周期/使用说明 同步
This commit is contained in:
@@ -46,7 +46,12 @@ namespace compiler {
|
||||
FALSE,
|
||||
TON,
|
||||
TOF,
|
||||
TP,
|
||||
CTU,
|
||||
CTD,
|
||||
CTUD,
|
||||
R_TRIG,
|
||||
F_TRIG,
|
||||
// 字面量
|
||||
IDENT, // text = 小写名
|
||||
INT_LIT, // int_value
|
||||
|
||||
@@ -327,10 +327,18 @@ namespace {
|
||||
f.code.push_back(isa::enc_slot(isa::Op::STORE_GLOBAL, t, it->second));
|
||||
}
|
||||
if (inst->type_name == "ton" || inst->type_name == "tof" ||
|
||||
inst->type_name == "ctu") {
|
||||
const isa::Op op = inst->type_name == "ton" ? isa::Op::CAL_TON
|
||||
: inst->type_name == "tof" ? isa::Op::CAL_TOF
|
||||
: isa::Op::CAL_CTU;
|
||||
inst->type_name == "tp" || inst->type_name == "ctu" ||
|
||||
inst->type_name == "ctd" || inst->type_name == "ctud" ||
|
||||
inst->type_name == "r_trig" || inst->type_name == "f_trig") {
|
||||
const isa::Op op =
|
||||
inst->type_name == "ton" ? isa::Op::CAL_TON
|
||||
: inst->type_name == "tof" ? isa::Op::CAL_TOF
|
||||
: inst->type_name == "tp" ? isa::Op::CAL_TP
|
||||
: inst->type_name == "ctu" ? isa::Op::CAL_CTU
|
||||
: inst->type_name == "ctd" ? isa::Op::CAL_CTD
|
||||
: inst->type_name == "ctud" ? isa::Op::CAL_CTUD
|
||||
: inst->type_name == "r_trig" ? isa::Op::CAL_R_TRIG
|
||||
: isa::Op::CAL_F_TRIG;
|
||||
f.code.push_back(isa::enc_slot(op, 0, inst->base));
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -78,10 +78,15 @@ namespace {
|
||||
// 字面量
|
||||
{"true", Tok::TRUE},
|
||||
{"false", Tok::FALSE},
|
||||
// 内建 FB 类型名(v1 冻结三件套)
|
||||
// 内置 FB 类型名(12.11 扩充为 8 个)
|
||||
{"ton", Tok::TON},
|
||||
{"tof", Tok::TOF},
|
||||
{"tp", Tok::TP},
|
||||
{"ctu", Tok::CTU},
|
||||
{"ctd", Tok::CTD},
|
||||
{"ctud", Tok::CTUD},
|
||||
{"r_trig", Tok::R_TRIG},
|
||||
{"f_trig", Tok::F_TRIG},
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
+18
-2
@@ -96,24 +96,40 @@ namespace {
|
||||
return k == TypeKind::Bool || k == TypeKind::Int || k == TypeKind::Time;
|
||||
}
|
||||
|
||||
// 内建 FB 布局(冻结,见 Doc/compiler/符号表与链接.md)
|
||||
// 内建 FB 布局(冻结,见 Doc/compiler/符号表与链接.md;12.11 扩为 8 个)
|
||||
const FbLayout kTonLayout{"ton", {{"in", TypeKind::Bool}, {"pt", TypeKind::Time},
|
||||
{"q", TypeKind::Bool}, {"et", TypeKind::Time}}};
|
||||
const FbLayout kTofLayout{"tof", {{"in", TypeKind::Bool}, {"pt", TypeKind::Time},
|
||||
{"q", TypeKind::Bool}, {"et", TypeKind::Time}}};
|
||||
const FbLayout kTpLayout{"tp", {{"in", TypeKind::Bool}, {"pt", TypeKind::Time},
|
||||
{"q", TypeKind::Bool}, {"et", TypeKind::Time}}};
|
||||
const FbLayout kCtuLayout{"ctu", {{"cu", TypeKind::Bool}, {"r", TypeKind::Bool},
|
||||
{"pv", TypeKind::Int}, {"q", TypeKind::Bool},
|
||||
{"cv", TypeKind::Int}}};
|
||||
const FbLayout kCtdLayout{"ctd", {{"cd", TypeKind::Bool}, {"ld", TypeKind::Bool},
|
||||
{"pv", TypeKind::Int}, {"q", TypeKind::Bool},
|
||||
{"cv", TypeKind::Int}}};
|
||||
const FbLayout kCtudLayout{"ctud", {{"cu", TypeKind::Bool}, {"cd", TypeKind::Bool},
|
||||
{"r", TypeKind::Bool}, {"lu", TypeKind::Bool},
|
||||
{"pv", TypeKind::Int}, {"qu", TypeKind::Bool},
|
||||
{"qd", TypeKind::Bool}, {"cv", TypeKind::Int}}};
|
||||
const FbLayout kRTrigLayout{"r_trig", {{"clk", TypeKind::Bool}, {"q", TypeKind::Bool}}};
|
||||
const FbLayout kFTrigLayout{"f_trig", {{"clk", TypeKind::Bool}, {"q", TypeKind::Bool}}};
|
||||
|
||||
/**
|
||||
* @brief 内建 FB 名 → 冻结布局
|
||||
* @param name FB 类型名(小写)
|
||||
* @return 布局指针(ton / tof / ctu);未知名字返回 nullptr
|
||||
* @return 布局指针(ton/tof/tp/ctu/ctd/ctud/r_trig/f_trig);未知返回 nullptr
|
||||
*/
|
||||
const FbLayout* builtin_layout(const std::string& name) {
|
||||
if (name == "ton") return &kTonLayout;
|
||||
if (name == "tof") return &kTofLayout;
|
||||
if (name == "tp") return &kTpLayout;
|
||||
if (name == "ctu") return &kCtuLayout;
|
||||
if (name == "ctd") return &kCtdLayout;
|
||||
if (name == "ctud") return &kCtudLayout;
|
||||
if (name == "r_trig") return &kRTrigLayout;
|
||||
if (name == "f_trig") return &kFTrigLayout;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -458,11 +458,36 @@ namespace {
|
||||
t->name = "tof";
|
||||
advance();
|
||||
return true;
|
||||
case Tok::TP:
|
||||
t->kind = TypeKind::FbBuiltin;
|
||||
t->name = "tp";
|
||||
advance();
|
||||
return true;
|
||||
case Tok::CTU:
|
||||
t->kind = TypeKind::FbBuiltin;
|
||||
t->name = "ctu";
|
||||
advance();
|
||||
return true;
|
||||
case Tok::CTD:
|
||||
t->kind = TypeKind::FbBuiltin;
|
||||
t->name = "ctd";
|
||||
advance();
|
||||
return true;
|
||||
case Tok::CTUD:
|
||||
t->kind = TypeKind::FbBuiltin;
|
||||
t->name = "ctud";
|
||||
advance();
|
||||
return true;
|
||||
case Tok::R_TRIG:
|
||||
t->kind = TypeKind::FbBuiltin;
|
||||
t->name = "r_trig";
|
||||
advance();
|
||||
return true;
|
||||
case Tok::F_TRIG:
|
||||
t->kind = TypeKind::FbBuiltin;
|
||||
t->name = "f_trig";
|
||||
advance();
|
||||
return true;
|
||||
case Tok::IDENT: {
|
||||
const std::string word = cur().text;
|
||||
if (is_forbidden(word)) {
|
||||
|
||||
Reference in New Issue
Block a user