Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2D array channel out shows errors like it was not constexpr: c_out: INVALID_ARGUMENT #1830

Open
Mars-Cat2023 opened this issue Jan 6, 2025 · 0 comments

Comments

@Mars-Cat2023
Copy link

Describe the bug
When adapt the example DSLX code matmul_4x4.x. I add another 2D array channel out (c_out: chan[3][3] out). But it gives me the error like not constexpr: 'c_out': INVALID_ARGUMENT. I didn't know where it needs this constexpr attribute.

To Reproduce
Steps to reproduce the behavior:

...
// well defined `proc node` here.
...

proc matmul<ROWS: u32, COLS: u32> {
    // Public Interface:
    a_in: chan<F32>[ROWS] in;
    b_in: chan<F32>[COLS] in;
    c_out: chan<F32>[COLS][ROWS] out;
    screenshot_reset: chan<bool> in;

    // Private (Internal) Members:
    west_inputs: chan<F32>[COLS + u32:1][ROWS] in;
    north_inputs: chan<F32>[COLS][ROWS + u32:1] in;
    east_outputs: chan<F32>[COLS + u32:1][ROWS] out;
    south_outputs: chan<F32>[COLS][ROWS + u32:1] out;


    config(a_in: chan<F32>[ROWS] in, b_in: chan<F32>[COLS] in, 
           c_out: chan<F32>[COLS][ROWS] out, screenshot_reset: chan<u1> in) {
        // Declare internal east-to-west channels and south-to-north channels.
        let (east_outputs, west_inputs) = chan<F32>[COLS + u32:1][ROWS]("east_west");
        let (south_outputs, north_inputs) = chan<F32>[COLS][ROWS + u32:1]("south_north");

        unroll_for! (row, _): (u32, ()) in u32:0..ROWS {
            unroll_for! (col, _): (u32, ()) in u32:0..COLS {
                spawn node(
                    west_inputs[row][col], north_inputs[row][col], east_outputs[row][col + u32:1], 
                    south_outputs[row + u32:1][col], screenshot_reset,
                    c_out[row][col]);
            }(());
        }(());
        
        (a_in, b_in, c_out, screenshot_reset, west_inputs, north_inputs, east_outputs, south_outputs)
    }

    init { () }

    next(state: ()) {
        // Send input matricies:
        let zero = u32:0;
        unroll_for! (row, _): (u32, ()) in u32:0..ROWS {
            let (tok, local_a) = recv(join(), a_in[row]);
            send(tok, east_outputs[row][zero], local_a);
        }(());
        unroll_for! (col, _): (u32, ()) in u32:0..COLS {
            let (tok, local_b) = recv(join(), b_in[col]);
            send(tok, south_outputs[zero][col], local_b);
        }(());

        // No useful outputs from the other side (Drop):
        // TODO - google/xls#1750: remove unroll_for! workaround.
        unroll_for! (cols, _): (u32, ()) in COLS..COLS + u32:1 {
            unroll_for! (row, _): (u32, ()) in u32:0..ROWS {
                recv(join(), west_inputs[row][cols]);
            }(());
        }(());
        unroll_for! (rows, _): (u32, ()) in ROWS..ROWS + u32:1 {
            unroll_for! (col, _): (u32, ()) in u32:0..COLS {
                recv(join(), north_inputs[rows][col]);
            }(());
        }(());
    }
}

// proc matmul_3x3 {
//     config(a_in: chan<F32>[3] in, b_in: chan<F32>[3] in, 
//            c_out: chan<F32>[3][3] out, screenshot_reset: chan<bool> in) {
//         spawn matmul<u32:3, u32:3>(a_in, b_in, c_out, screenshot_reset);
//     }

//     init { () }

//     next(state: ()) { }
// }

Expected behavior

If you remove the comment sign before this part :

proc matmul_3x3 {
    config(a_in: chan<F32>[3] in, b_in: chan<F32>[3] in, 
           c_out: chan<F32>[3][3] out, screenshot_reset: chan<bool> in) {
        spawn matmul<u32:3, u32:3>(a_in, b_in, c_out, screenshot_reset);
    }

    init { () }

    next(state: ()) { }
}

Then when you call it by spawn matmul_3x3(a_in, b_in, c_out, screenshot_reset); in the following test_proc, it will give you error like this:

$ ./bazel-bin/xls/dslx/interpreter_main  E3_F32_matrixmul4_3_2025.x
E0106 16:52:13.244860   19019 command_line_utils.cc:50] Could not extract a textual position from error message: INVALID_ARGUMENT: Expression @ E3_F32_matrixmul4_3_2025.x:126:48-126:53 was not constexpr: `c_out`: INVALID_ARGUMENT: Provided status is not in recognized error form: INVALID_ARGUMENT: Expression @ E3_F32_matrixmul4_3_2025.x:126:48-126:53 was not constexpr: `c_out`
Error: INVALID_ARGUMENT: Expression @ E3_F32_matrixmul4_3_2025.x:126:48-126:53 was not constexpr: `c_out`

but if I remove that layer of abstraction by calling the spawn matmul<u32:3, u32:3>(a_in, b_in, c_out, screenshot_reset); myself, it will not give any problems. Why?
I am confusing where do I use constexpr in my code? Why it doesn't work if I define 2D output channels? But it still work well if I only define 1D output channels like example code from your github repo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant