// ============================================================================
// cyclic_tag_system.v - 循环标签系统
// 证明规则110通用性的中间步骤
// ============================================================================
module cyclic_tag_system #(
    parameter DATA_W   = 64,      // 数据字符串最大长度
    parameter NUM_RULES = 8,       // 产生式规则数量
    parameter RULE_W   = 8        // 每条规则的长度
)(
    input  wire                  clk,
    input  wire                  rst_n,
    input  wire                  run,        // 运行使能
    input  wire [NUM_RULES*RULE_W-1:0] rules, // 产生式规则表
    output wire [DATA_W-1:0]     data_out,   // 当前数据字符串
    output wire [$clog2(NUM_RULES)-1:0] rule_ptr, // 当前规则指针
    output wire                  halted      // 系统停止（数据为空）
);

    // ---- 数据寄存器（移位寄存器） ----
    reg [DATA_W-1:0] data;
    reg [$clog2(NUM_RULES)-1:0] rptr;
    reg [DATA_W-1:0] length;  // 有效数据长度

    // ---- 当前产生式 ----
    wire [RULE_W-1:0] current_rule = rules[rptr * RULE_W +: RULE_W];

    // ---- CTS步骤 ----
    // 1. 检查首bit
    // 2. 若首bit=1，将当前产生式追加到数据末尾
    // 3. 删除首bit（左移）
    // 4. 规则指针循环+1
    wire head_bit = data[0];  // 首bit

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            data   <= {DATA_W{1'b0}};
            rptr   <= 0;
            length <= 0;
        end else if (run && (length > 0)) begin
            // 左移（删除首bit）
            data <= data >> 1;
            length <= length - 1;

            // 如果首bit为1，追加产生式
            if (head_bit) begin
                data[DATA_W-1-:RULE_W] <= current_rule;
                length <= length + RULE_W - 1;  // -1因为删了首bit
            end

            // 规则指针循环
            if (rptr == NUM_RULES - 1)
                rptr <= 0;
            else
                rptr <= rptr + 1;
        end
    end

    assign data_out = data;
    assign rule_ptr = rptr;
    assign halted   = (length == 0);

endmodule