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

Slow with many curly braces ({) #1860

Open
richyliu opened this issue Jan 29, 2024 · 1 comment
Open

Slow with many curly braces ({) #1860

richyliu opened this issue Jan 29, 2024 · 1 comment

Comments

@richyliu
Copy link

In the following file, inserting a line before the last line is extremely slow

{
a {
}
a {
}
a {
}
a {
}
a {
}
a {
}
a {
}
a {
}
a {
}
} // insert a newline before me

Adding more a { and } in the above pattern increases the delay exponentially (or at least worst than linearly). The above is a minimally reproducible example. The following is an example of this issue in real SystemVerilog:

constraint instr_c {
  instr_type[0] -> {
    instr.i_type.opcode == op_imm;
    instr.r_type.funct3 == sr -> {
      instr.r_type.funct7 inside {base, variant};
    }
  }

  instr_type[1] -> {
      instr.r_type.opcode == op_reg;
  }

  instr_type[2] -> {
    instr.s_type.opcode == op_store;
    instr.s_type.funct3 inside {sw, sb, sh};
  }

  instr_type[3] -> {
    instr.i_type.opcode == op_load;
    instr.i_type.funct3 inside {lb, lh, lw, lbu, lhu};
  }

  instr_type[4] -> {
    instr.b_type.opcode == op_br;
    instr.b_type.funct3 inside {beq, bne, blt, bge, bltu, bgeu};
  }

  instr_type[5] -> {
    instr.i_type.opcode == op_jalr;
    instr.i_type.funct3 == 0;
  }

  instr_type[6] -> {
    instr.j_type.opcode == op_jal;
  }

  instr_type[7] -> {
    instr.u_type.opcode == op_auipc;
  }

  instr_type[8] -> {
    instr.u_type.opcode == op_lui;
  }
} // insert a newline before me

The following is the profiler results:

  501  62% - command-execute
  501  62%  - funcall-interactively
  497  62%   - evil-open-below
  497  62%    - apply
  497  62%     - +evil--insert-newline-below-and-respect-comments-a
  497  62%      - if
  497  62%       - let
  497  62%        - let*
  497  62%         - unwind-protect
  497  62%          - progn
  497  62%           - let
  497  62%            - funcall
  497  62%             - #<subr evil-open-below>
  496  62%              - indent-according-to-mode
  496  62%               - verilog-indent-line-relative
  496  62%                - verilog-continued-line
  496  62%                 - verilog-backward-token
  477  59%                  - verilog-at-close-constraint-p
  477  59%                   - verilog-in-coverage-p
  477  59%                    - verilog-at-constraint-p
  477  59%                     - verilog-beg-of-statement
  477  59%                      - verilog-backward-token
  477  59%                       - verilog-at-close-constraint-p
  477  59%                        - verilog-in-coverage-p
  477  59%                         - verilog-at-constraint-p
  477  59%                          - verilog-beg-of-statement
  477  59%                           - verilog-backward-token
  476  59%                            - verilog-at-close-constraint-p
  476  59%                             - verilog-in-coverage-p
  475  59%                              - verilog-at-constraint-p
  475  59%                               - verilog-beg-of-statement
  475  59%                                - verilog-backward-token
  349  43%                                 - verilog-at-close-constraint-p
  348  43%                                  - verilog-in-coverage-p
  336  42%                                   - verilog-at-constraint-p
   82  10%                                    - verilog-beg-of-statement
   45   5%                                     + verilog-backward-token
   27   3%                                     + verilog-forward-syntactic-ws
   10   1%                                       verilog-backward-syntactic-ws
   58   7%                                    + verilog-backward-ws&directives
   21   2%                                    + verilog-backward-token
    4   0%                                   + verilog-in-paren
  107  13%                                 + verilog-at-constraint-p
   19   2%                                 + verilog-backward-syntactic-ws
    1   0%                              + verilog-backward-up-list
    1   0%                              verilog-backward-syntactic-ws
   19   2%                  + verilog-at-constraint-p
    1   0%              + #<subr F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_158>
    4   0%   + doom/toggle-profiler
  233  29% + ...
   60   7% + redisplay_internal (C function)
    1   0% + timer-event-handler
    1   0% + copilot--post-command
    1   0% + jsonrpc--process-filter
@wsnyder
Copy link
Member

wsnyder commented Feb 6, 2024

Good debugging! Perhaps you could propose a patch to fix this - maybe just short circuit when called recursively?

I'm not that familiar personally with the indentation side of Verilog-Mode, so don't have suggestions as to the best approach.

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

2 participants