(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:REMOTE_HOST) op:Equal rhs:{(SQ )} spids:[43])]
      spids: [43]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:LIST_DEVS) op:Equal rhs:{(FALSE)} spids:[45])]
      spids: [45]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:DEBUGFS)
          op: Equal
          rhs: 
            {
              (BracedVarSub
                token: <VSub_Name DEBUGFS>
                suffix_op: 
                  (StringUnary
                    op_id: VTest_Hyphen
                    arg_word: {(Lit_Slash /) (sys) (Lit_Slash /) (kernel) (Lit_Slash /) (debug)}
                  )
                spids: [50 59]
              )
            }
          spids: [49]
        )
      ]
      spids: [49]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:PERF_RUN_ORDER) op:Equal rhs:{(32)} spids:[62])]
      spids: [62]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:MAX_MW_SIZE) op:Equal rhs:{(0)} spids:[65])]
      spids: [65]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:RUN_DMA_TESTS) op:Equal rhs:{(SQ )} spids:[68])]
      spids: [68]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:DONT_CLEANUP) op:Equal rhs:{(SQ )} spids:[70])]
      spids: [70]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:MW_SIZE) op:Equal rhs:{(65536)} spids:[72])]
      spids: [72]
    )
    (FuncDef
      name: show_help
      body: 
        (BraceGroup
          children: [
            (C {(echo)} {(DQ ("Usage: ") ($ VSub_Number "$0") (" [OPTIONS] LOCAL_DEV REMOTE_DEV"))})
            (C {(echo)} {(DQ ("Run tests on a pair of NTB endpoints."))})
            (C {(echo)})
            (C {(echo)} {(DQ ("If the NTB device loops back to the same host then,"))})
            (C {(echo)} {(DQ ("just specifying the two PCI ids on the command line is"))})
            (C {(echo)} {(DQ ("sufficient. Otherwise, if the NTB link spans two hosts"))})
            (C {(echo)} {(DQ ("use the -r option to specify the hostname for the remote"))})
            (C {(echo)} {(DQ ("device. SSH will then be used to test the remote side."))})
            (C {(echo)} {(DQ ("An SSH key between the root users of the host would then"))})
            (C {(echo)} {(DQ ("be highly recommended."))})
            (C {(echo)})
            (C {(echo)} {(DQ ("Options:"))})
            (C {(echo)} {(DQ ("  -C              don't cleanup ntb modules on exit"))})
            (C {(echo)} {(DQ ("  -d              run dma tests"))})
            (C {(echo)} {(DQ ("  -h              show this help message"))})
            (C {(echo)} {(DQ ("  -l              list available local and remote PCI ids"))})
            (C {(echo)} {(DQ ("  -r REMOTE_HOST  specify the remote's hostname to connect"))})
            (C {(echo)} {(DQ ("                  to for the test (using ssh)"))})
            (C {(echo)} 
              {
                (DQ ("  -p NUM          ntb_perf run order (default: ") 
                  ($ VSub_Name "$PERF_RUN_ORDER") (")")
                )
              }
            )
            (C {(echo)} {(DQ ("  -w max_mw_size  maxmium memory window size"))})
            (C {(echo)})
          ]
          spids: [82]
        )
      spids: [76 81]
    )
    (FuncDef
      name: parse_args
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:OPTIND) op:Equal rhs:{(0)} spids:[235])]
              spids: [235]
            )
            (While
              cond: [
                (Sentence
                  child: (C {(getopts)} {(DQ ("Cdhlm:r:p:w:"))} {(opt)})
                  terminator: <Op_Semi ";">
                )
              ]
              body: 
                (DoGroup
                  children: [
                    (Case
                      to_match: {(DQ ($ VSub_Name "$opt"))}
                      arms: [
                        (case_arm
                          pat_list: [{(C)}]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:DONT_CLEANUP)
                                  op: Equal
                                  rhs: {(1)}
                                  spids: [265]
                                )
                              ]
                              spids: [265]
                            )
                          ]
                          spids: [262 263 268 -1]
                        )
                        (case_arm
                          pat_list: [{(d)}]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:RUN_DMA_TESTS)
                                  op: Equal
                                  rhs: {(1)}
                                  spids: [274]
                                )
                              ]
                              spids: [274]
                            )
                          ]
                          spids: [271 272 277 -1]
                        )
                        (case_arm
                          pat_list: [{(h)}]
                          action: [
                            (Sentence
                              child: (C {(show_help)})
                              terminator: <Op_Semi ";">
                            )
                            (C {(exit)} {(0)})
                          ]
                          spids: [280 281 290 -1]
                        )
                        (case_arm
                          pat_list: [{(l)}]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:LIST_DEVS)
                                  op: Equal
                                  rhs: {(TRUE)}
                                  spids: [296]
                                )
                              ]
                              spids: [296]
                            )
                          ]
                          spids: [293 294 299 -1]
                        )
                        (case_arm
                          pat_list: [{(m)}]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:MW_SIZE)
                                  op: Equal
                                  rhs: {(${ VSub_Name OPTARG)}
                                  spids: [305]
                                )
                              ]
                              spids: [305]
                            )
                          ]
                          spids: [302 303 310 -1]
                        )
                        (case_arm
                          pat_list: [{(r)}]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:REMOTE_HOST)
                                  op: Equal
                                  rhs: {(${ VSub_Name OPTARG)}
                                  spids: [316]
                                )
                              ]
                              spids: [316]
                            )
                          ]
                          spids: [313 314 321 -1]
                        )
                        (case_arm
                          pat_list: [{(p)}]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:PERF_RUN_ORDER)
                                  op: Equal
                                  rhs: {(${ VSub_Name OPTARG)}
                                  spids: [327]
                                )
                              ]
                              spids: [327]
                            )
                          ]
                          spids: [324 325 332 -1]
                        )
                        (case_arm
                          pat_list: [{(w)}]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:MAX_MW_SIZE)
                                  op: Equal
                                  rhs: {(${ VSub_Name OPTARG)}
                                  spids: [338]
                                )
                              ]
                              spids: [338]
                            )
                          ]
                          spids: [335 336 343 -1]
                        )
                        (case_arm
                          pat_list: [{(EscapedLiteralPart token:<Lit_EscapedChar "\\?">)}]
                          action: [
                            (SimpleCommand
                              words: [{(echo)} {(DQ ("Invalid option: -") ($ VSub_Name "$OPTARG"))}]
                              redirects: [
                                (Redir
                                  op_id: Redir_GreatAnd
                                  fd: -1
                                  arg_word: {(2)}
                                  spids: [357]
                                )
                              ]
                            )
                            (C {(exit)} {(1)})
                          ]
                          spids: [346 347 366 -1]
                        )
                      ]
                      spids: [253 259 369]
                    )
                  ]
                  spids: [250 372]
                )
            )
          ]
          spids: [232]
        )
      spids: [226 231]
    )
    (C {(parse_args)} {(DQ ($ VSub_At "$@"))})
    (C {(shift)} 
      {
        (ArithSubPart
          anode: 
            (ArithBinary
              op_id: Arith_Minus
              left: (ArithVarRef name:OPTIND)
              right: (ArithWord w:{(Lit_Digits 1)})
            )
          spids: [385 390]
        )
      }
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:LOCAL_DEV)
          op: Equal
          rhs: {($ VSub_Number "$1")}
          spids: [392]
        )
      ]
      spids: [392]
    )
    (C {(shift)})
    (C {(parse_args)} {(DQ ($ VSub_At "$@"))})
    (C {(shift)} 
      {
        (ArithSubPart
          anode: 
            (ArithBinary
              op_id: Arith_Minus
              left: (ArithVarRef name:OPTIND)
              right: (ArithWord w:{(Lit_Digits 1)})
            )
          spids: [405 410]
        )
      }
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:REMOTE_DEV)
          op: Equal
          rhs: {($ VSub_Number "$1")}
          spids: [412]
        )
      ]
      spids: [412]
    )
    (C {(shift)})
    (C {(parse_args)} {(DQ ($ VSub_At "$@"))})
    (C {(set)} {(-e)})
    (FuncDef
      name: _modprobe
      body: (BraceGroup children:[(C {(modprobe)} {(DQ ($ VSub_At "$@"))})] spids:[435])
      spids: [429 434]
    )
    (FuncDef
      name: split_remote
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:VPATH)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [456]
                )
              ]
              spids: [456]
            )
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:REMOTE) op:Equal rhs:{(SQ )} spids:[460])]
              spids: [460]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {(DQ ($ VSub_Name "$VPATH"))}
                              right: {(Lit_Other "*") (DQ (":/")) (Lit_Other "*")}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:REMOTE)
                          op: Equal
                          rhs: 
                            {
                              (BracedVarSub
                                token: <VSub_Name VPATH>
                                suffix_op: (StringUnary op_id:VOp1_DPercent arg_word:{(":*")})
                                spids: [487 491]
                              )
                            }
                          spids: [486]
                        )
                      ]
                      spids: [486]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:VPATH)
                          op: Equal
                          rhs: 
                            {
                              (BracedVarSub
                                token: <VSub_Name VPATH>
                                suffix_op: (StringUnary op_id:VOp1_Pound arg_word:{("*:")})
                                spids: [495 499]
                              )
                            }
                          spids: [494]
                        )
                      ]
                      spids: [494]
                    )
                  ]
                  spids: [-1 483]
                )
              ]
              spids: [-1 502]
            )
          ]
          spids: [453]
        )
      spids: [447 452]
    )
    (FuncDef
      name: read_file
      body: 
        (BraceGroup
          children: [
            (C {(split_remote)} {($ VSub_Number "$1")})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobNEqual
                              left: {(DQ ($ VSub_Name "$REMOTE"))}
                              right: {(DQ )}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (C {(ssh)} {(DQ ($ VSub_Name "$REMOTE"))} {(cat)} {(DQ ($ VSub_Name "$VPATH"))})
                  ]
                  spids: [-1 537]
                )
              ]
              else_action: [(C {(cat)} {(DQ ($ VSub_Name "$VPATH"))})]
              spids: [553 563]
            )
          ]
          spids: [513]
        )
      spids: [507 512]
    )
    (FuncDef
      name: write_file
      body: 
        (BraceGroup
          children: [
            (C {(split_remote)} {($ VSub_Number "$2")})
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:VALUE)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [582]
                )
              ]
              spids: [582]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobNEqual
                              left: {(DQ ($ VSub_Name "$REMOTE"))}
                              right: {(DQ )}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (C {(ssh)} {(DQ ($ VSub_Name "$REMOTE"))} 
                      {
                        (DQ ("echo ") (EscapedLiteralPart token:<Lit_EscapedChar "\\\"">) 
                          ($ VSub_Name "$VALUE") (EscapedLiteralPart token:<Lit_EscapedChar "\\\"">) (" > ") 
                          (EscapedLiteralPart
                            token: <Lit_EscapedChar "\\\"">
                          ) ($ VSub_Name "$VPATH") (EscapedLiteralPart token:<Lit_EscapedChar "\\\"">)
                        )
                      }
                    )
                  ]
                  spids: [-1 603]
                )
              ]
              else_action: [
                (SimpleCommand
                  words: [{(echo)} {(DQ ($ VSub_Name "$VALUE"))}]
                  redirects: [
                    (Redir
                      op_id: Redir_Great
                      fd: -1
                      arg_word: {(DQ ($ VSub_Name "$VPATH"))}
                      spids: [633]
                    )
                  ]
                )
              ]
              spids: [624 640]
            )
          ]
          spids: [574]
        )
      spids: [568 573]
    )
    (FuncDef
      name: link_test
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:LOC)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [654]
                )
              ]
              spids: [654]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REM)
                  op: Equal
                  rhs: {($ VSub_Number "$2")}
                  spids: [658]
                )
              ]
              spids: [658]
            )
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:EXP) op:Equal rhs:{(0)} spids:[662])]
              spids: [662]
            )
            (C {(echo)} 
              {
                (DQ ("Running link tests on: ") 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(basename)} {($ VSub_Name "$LOC")})])
                    left_token: <Left_CommandSub "$(">
                    spids: [671 675]
                  ) (" / ") 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(basename)} {($ VSub_Name "$REM")})])
                    left_token: <Left_CommandSub "$(">
                    spids: [677 681]
                  )
                )
              }
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (Pipeline
                          children: [
                            (SimpleCommand
                              words: [{(write_file)} {(DQ (N))} {(DQ ($ VSub_Name "$LOC") (/link))}]
                              redirects: [
                                (Redir
                                  op_id: Redir_Great
                                  fd: 2
                                  arg_word: {(/dev/null)}
                                  spids: [701]
                                )
                              ]
                            )
                          ]
                          negated: True
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ("  Unsupported"))})
                    (ControlFlow token:<ControlFlow_Return return>)
                  ]
                  spids: [-1 706]
                )
              ]
              spids: [-1 719]
            )
            (C {(write_file)} {(DQ (N))} {(DQ ($ VSub_Name "$LOC") (/link_event))})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobNEqual
                              left: 
                                {
                                  (CommandSubPart
                                    command_list: 
                                      (CommandList
                                        children: [(C {(read_file)} {(DQ ($ VSub_Name "$REM") (/link))})]
                                      )
                                    left_token: <Left_CommandSub "$(">
                                    spids: [740 747]
                                  )
                                }
                              right: {(DQ (N))}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (SimpleCommand
                      words: [
                        {(echo)}
                        {(DQ ("Expected remote link to be down in ") ($ VSub_Name "$REM") (/link))}
                      ]
                      redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[769])]
                    )
                    (C {(exit)} {(-1)})
                  ]
                  spids: [-1 758]
                )
              ]
              spids: [-1 778]
            )
            (C {(write_file)} {(DQ (Y))} {(DQ ($ VSub_Name "$LOC") (/link))})
            (C {(write_file)} {(DQ (Y))} {(DQ ($ VSub_Name "$LOC") (/link_event))})
            (C {(echo)} {(DQ ("  Passed"))})
          ]
          spids: [651]
        )
      spids: [645 650]
    )
    (FuncDef
      name: doorbell_test
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:LOC)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [825]
                )
              ]
              spids: [825]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REM)
                  op: Equal
                  rhs: {($ VSub_Number "$2")}
                  spids: [829]
                )
              ]
              spids: [829]
            )
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:EXP) op:Equal rhs:{(0)} spids:[833])]
              spids: [833]
            )
            (C {(echo)} 
              {
                (DQ ("Running db tests on: ") 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(basename)} {($ VSub_Name "$LOC")})])
                    left_token: <Left_CommandSub "$(">
                    spids: [842 846]
                  ) (" / ") 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(basename)} {($ VSub_Name "$REM")})])
                    left_token: <Left_CommandSub "$(">
                    spids: [848 852]
                  )
                )
              }
            )
            (C {(write_file)} {(DQ ("c 0xFFFFFFFF"))} {(DQ ($ VSub_Name "$REM") (/db))})
            (ForExpr
              init: 
                (BinaryAssign
                  op_id: Arith_Equal
                  left: (LhsName name:i)
                  right: (ArithWord w:{(Lit_Digits 1)})
                )
              cond: 
                (ArithBinary
                  op_id: Arith_LessEqual
                  left: (ArithVarRef name:i)
                  right: (ArithWord w:{(Lit_Digits 8)})
                )
              update: (UnaryAssign op_id:Node_PostDPlus child:(LhsName name:i))
              body: 
                (DoGroup
                  children: [
                    (AndOr
                      children: [
                        (C {(let)} 
                          {(Lit_VarLike "DB=") 
                            (CommandSubPart
                              command_list: 
                                (CommandList
                                  children: [(C {(read_file)} {(DQ ($ VSub_Name "$REM") (/db))})]
                                )
                              left_token: <Left_CommandSub "$(">
                              spids: [897 904]
                            )
                          }
                        )
                        (C {(true)})
                      ]
                      op_id: Op_DPipe
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_GlobNEqual
                                      left: {(DQ ($ VSub_Name "$DB"))}
                                      right: {(DQ ($ VSub_Name "$EXP"))}
                                    )
                                )
                              terminator: <Op_Semi ";">
                            )
                          ]
                          action: [
                            (SimpleCommand
                              words: [
                                {(echo)}
                                {
                                  (DQ ("Doorbell doesn't match expected value ") ($ VSub_Name "$EXP") 
                                    (" ")
                                  )
                                }
                                {(DQ ("in ") ($ VSub_Name "$REM") (/db))}
                              ]
                              redirects: [
                                (Redir
                                  op_id: Redir_GreatAnd
                                  fd: -1
                                  arg_word: {(2)}
                                  spids: [947]
                                )
                              ]
                            )
                            (C {(exit)} {(-1)})
                          ]
                          spids: [-1 928]
                        )
                      ]
                      spids: [-1 956]
                    )
                    (AndOr
                      children: [
                        (C {(let)} {(DQ ("MASK=1 << (") ($ VSub_Name "$i") ("-1)"))})
                        (C {(true)})
                      ]
                      op_id: Op_DPipe
                    )
                    (AndOr
                      children: [
                        (C {(let)} {(DQ ("EXP=") ($ VSub_Name "$EXP") (" | ") ($ VSub_Name "$MASK"))})
                        (C {(true)})
                      ]
                      op_id: Op_DPipe
                    )
                    (C {(write_file)} {(DQ ("s ") ($ VSub_Name "$MASK"))} 
                      {(DQ ($ VSub_Name "$LOC") (/peer_db))}
                    )
                  ]
                  spids: [891 1000]
                )
            )
            (C {(echo)} {(DQ ("  Passed"))})
          ]
          spids: [822]
        )
      spids: [816 821]
    )
    (FuncDef
      name: read_spad
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:VPATH)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [1022]
                )
              ]
              spids: [1022]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:IDX)
                  op: Equal
                  rhs: {($ VSub_Number "$2")}
                  spids: [1026]
                )
              ]
              spids: [1026]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:ROW)
                  op: Equal
                  rhs: 
                    {
                      (ArrayLiteralPart
                        words: [
                          {
                            (CommandSubPart
                              command_list: 
                                (CommandList
                                  children: [
                                    (Pipeline
                                      children: [
                                        (C {(read_file)} {(DQ ($ VSub_Name "$VPATH"))})
                                        (C {(grep)} {(-e)} {(DQ ("^") ($ VSub_Name "$IDX"))})
                                      ]
                                      negated: False
                                    )
                                  ]
                                )
                              left_token: <Left_CommandSub "$(">
                              spids: [1033 1050]
                            )
                          }
                        ]
                      )
                    }
                  spids: [1031]
                )
              ]
              spids: [1031]
            )
            (AndOr
              children: [
                (C {(let)} 
                  {(Lit_VarLike "VAL=") 
                    (BracedVarSub
                      token: <VSub_Name ROW>
                      bracket_op: (ArrayIndex expr:(ArithWord w:{(Lit_Digits 1)}))
                      spids: [1057 1062]
                    )
                  }
                )
                (C {(true)})
              ]
              op_id: Op_DPipe
            )
            (C {(echo)} {($ VSub_Name "$VAL")})
          ]
          spids: [1019]
        )
      spids: [1013 1018]
    )
    (FuncDef
      name: scratchpad_test
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:LOC)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [1085]
                )
              ]
              spids: [1085]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REM)
                  op: Equal
                  rhs: {($ VSub_Number "$2")}
                  spids: [1089]
                )
              ]
              spids: [1089]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:CNT)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [
                              (Pipeline
                                children: [
                                  (C {(read_file)} {(DQ ($ VSub_Name "$LOC") (/spad))})
                                  (C {(wc)} {(-l)})
                                ]
                                negated: False
                              )
                            ]
                          )
                        left_token: <Left_CommandSub "$(">
                        spids: [1094 1107]
                      )
                    }
                  spids: [1093]
                )
              ]
              spids: [1093]
            )
            (C {(echo)} 
              {
                (DQ ("Running spad tests on: ") 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(basename)} {($ VSub_Name "$LOC")})])
                    left_token: <Left_CommandSub "$(">
                    spids: [1115 1119]
                  ) (" / ") 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(basename)} {($ VSub_Name "$REM")})])
                    left_token: <Left_CommandSub "$(">
                    spids: [1121 1125]
                  )
                )
              }
            )
            (ForExpr
              init: 
                (BinaryAssign
                  op_id: Arith_Equal
                  left: (LhsName name:i)
                  right: (ArithWord w:{(Lit_Digits 0)})
                )
              cond: 
                (ArithBinary
                  op_id: Arith_Less
                  left: (ArithVarRef name:i)
                  right: (ArithWord w:{($ VSub_Name "$CNT")})
                )
              update: (UnaryAssign op_id:Node_PostDPlus child:(LhsName name:i))
              body: 
                (DoGroup
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:VAL)
                          op: Equal
                          rhs: {($ VSub_Name "$RANDOM")}
                          spids: [1156]
                        )
                      ]
                      spids: [1156]
                    )
                    (C {(write_file)} {(DQ ($ VSub_Name "$i") (" ") ($ VSub_Name "$VAL"))} 
                      {(DQ ($ VSub_Name "$LOC") (/peer_spad))}
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:RVAL)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (C {(read_spad)} {(DQ ($ VSub_Name "$REM") (/spad))} 
                                        {($ VSub_Name "$i")}
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub "$(">
                                spids: [1175 1184]
                              )
                            }
                          spids: [1174]
                        )
                      ]
                      spids: [1174]
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_GlobNEqual
                                      left: {(DQ ($ VSub_Name "$VAL"))}
                                      right: {(DQ ($ VSub_Name "$RVAL"))}
                                    )
                                )
                              terminator: <Op_Semi ";">
                            )
                          ]
                          action: [
                            (SimpleCommand
                              words: [
                                {(echo)}
                                {
                                  (DQ ("Scratchpad doesn't match expected value ") 
                                    ($ VSub_Name "$VAL") (" ")
                                  )
                                }
                                {
                                  (DQ ("in ") ($ VSub_Name "$REM") ("/spad, got ") ($ VSub_Name "$RVAL"))
                                }
                              ]
                              redirects: [
                                (Redir
                                  op_id: Redir_GreatAnd
                                  fd: -1
                                  arg_word: {(2)}
                                  spids: [1225]
                                )
                              ]
                            )
                            (C {(exit)} {(-1)})
                          ]
                          spids: [-1 1205]
                        )
                      ]
                      spids: [-1 1234]
                    )
                  ]
                  spids: [1153 1238]
                )
            )
            (C {(echo)} {(DQ ("  Passed"))})
          ]
          spids: [1082]
        )
      spids: [1076 1081]
    )
    (FuncDef
      name: write_mw
      body: 
        (BraceGroup
          children: [
            (C {(split_remote)} {($ VSub_Number "$2")})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobNEqual
                              left: {(DQ ($ VSub_Name "$REMOTE"))}
                              right: {(DQ )}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (AndOr
                      children: [
                        (SimpleCommand
                          words: [
                            {(ssh)}
                            {(DQ ($ VSub_Name "$REMOTE"))}
                            {(dd)}
                            {(Lit_VarLike "if=") (/dev/urandom)}
                            {(DQ ("of=") ($ VSub_Name "$VPATH"))}
                          ]
                          redirects: [
                            (Redir
                              op_id: Redir_Great
                              fd: 2
                              arg_word: {(/dev/null)}
                              spids: [1303]
                            )
                          ]
                        )
                        (C {(true)})
                      ]
                      op_id: Op_DPipe
                    )
                  ]
                  spids: [-1 1282]
                )
              ]
              else_action: [
                (AndOr
                  children: [
                    (SimpleCommand
                      words: [
                        {(dd)}
                        {(Lit_VarLike "if=") (/dev/urandom)}
                        {(DQ ("of=") ($ VSub_Name "$VPATH"))}
                      ]
                      redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[1325])]
                    )
                    (C {(true)})
                  ]
                  op_id: Op_DPipe
                )
              ]
              spids: [1312 1334]
            )
          ]
          spids: [1257]
        )
      spids: [1251 1256]
    )
    (FuncDef
      name: mw_test
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:IDX)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [1348]
                )
              ]
              spids: [1348]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:LOC)
                  op: Equal
                  rhs: {($ VSub_Number "$2")}
                  spids: [1352]
                )
              ]
              spids: [1352]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REM)
                  op: Equal
                  rhs: {($ VSub_Number "$3")}
                  spids: [1356]
                )
              ]
              spids: [1356]
            )
            (C {(echo)} 
              {
                (DQ ("Running ") ($ VSub_Name "$IDX") (" tests on: ") 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(basename)} {($ VSub_Name "$LOC")})])
                    left_token: <Left_CommandSub "$(">
                    spids: [1367 1371]
                  ) (" / ") 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(basename)} {($ VSub_Name "$REM")})])
                    left_token: <Left_CommandSub "$(">
                    spids: [1373 1377]
                  )
                )
              }
            )
            (C {(write_mw)} {(DQ ($ VSub_Name "$LOC") (/) ($ VSub_Name "$IDX"))})
            (C {(split_remote)} {(DQ ($ VSub_Name "$LOC") (/) ($ VSub_Name "$IDX"))})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {(DQ ($ VSub_Name "$REMOTE"))}
                              right: {(DQ )}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:A)
                          op: Equal
                          rhs: {($ VSub_Name "$VPATH")}
                          spids: [1420]
                        )
                      ]
                      spids: [1420]
                    )
                  ]
                  spids: [-1 1417]
                )
              ]
              else_action: [
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:A)
                      op: Equal
                      rhs: {(/tmp/ntb_test.) ($ VSub_Dollar "$$") (.A)}
                      spids: [1427]
                    )
                  ]
                  spids: [1427]
                )
                (SimpleCommand
                  words: [{(ssh)} {(DQ ($ VSub_Name "$REMOTE"))} {(cat)} {(DQ ($ VSub_Name "$VPATH"))}]
                  redirects: [
                    (Redir
                      op_id: Redir_Great
                      fd: -1
                      arg_word: {(DQ ($ VSub_Name "$A"))}
                      spids: [1445]
                    )
                  ]
                )
              ]
              spids: [1424 1452]
            )
            (C {(split_remote)} {(DQ ($ VSub_Name "$REM") (/peer_) ($ VSub_Name "$IDX"))})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {(DQ ($ VSub_Name "$REMOTE"))}
                              right: {(DQ )}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:B)
                          op: Equal
                          rhs: {($ VSub_Name "$VPATH")}
                          spids: [1484]
                        )
                      ]
                      spids: [1484]
                    )
                  ]
                  spids: [-1 1481]
                )
              ]
              else_action: [
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:B)
                      op: Equal
                      rhs: {(/tmp/ntb_test.) ($ VSub_Dollar "$$") (.B)}
                      spids: [1491]
                    )
                  ]
                  spids: [1491]
                )
                (SimpleCommand
                  words: [{(ssh)} {(DQ ($ VSub_Name "$REMOTE"))} {(cat)} {(DQ ($ VSub_Name "$VPATH"))}]
                  redirects: [
                    (Redir
                      op_id: Redir_Great
                      fd: -1
                      arg_word: {(DQ ($ VSub_Name "$B"))}
                      spids: [1509]
                    )
                  ]
                )
              ]
              spids: [1488 1516]
            )
            (C {(cmp)} {(-n)} {($ VSub_Name "$MW_SIZE")} {(DQ ($ VSub_Name "$A"))} 
              {(DQ ($ VSub_Name "$B"))}
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobNEqual
                              left: {($ VSub_QMark "$?")}
                              right: {(0)}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (SimpleCommand
                      words: [{(echo)} {(DQ ("Memory window ") ($ VSub_Name "$MW") (" did not match!"))}]
                      redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[1559])]
                    )
                  ]
                  spids: [-1 1548]
                )
              ]
              spids: [-1 1563]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {(DQ ($ VSub_Name "$A"))}
                              right: {(DQ ("/tmp/*"))}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [(C {(rm)} {(DQ ($ VSub_Name "$A"))})]
                  spids: [-1 1584]
                )
              ]
              spids: [-1 1594]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {(DQ ($ VSub_Name "$B"))}
                              right: {(DQ ("/tmp/*"))}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [(C {(rm)} {(DQ ($ VSub_Name "$B"))})]
                  spids: [-1 1615]
                )
              ]
              spids: [-1 1625]
            )
            (C {(echo)} {(DQ ("  Passed"))})
          ]
          spids: [1345]
        )
      spids: [1339 1344]
    )
    (FuncDef
      name: pingpong_test
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:LOC)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [1647]
                )
              ]
              spids: [1647]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REM)
                  op: Equal
                  rhs: {($ VSub_Number "$2")}
                  spids: [1651]
                )
              ]
              spids: [1651]
            )
            (C {(echo)} 
              {
                (DQ ("Running ping pong tests on: ") 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(basename)} {($ VSub_Name "$LOC")})])
                    left_token: <Left_CommandSub "$(">
                    spids: [1660 1664]
                  ) (" / ") 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(basename)} {($ VSub_Name "$REM")})])
                    left_token: <Left_CommandSub "$(">
                    spids: [1666 1670]
                  )
                )
              }
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:LOC_START)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [(C {(read_file)} {($ VSub_Name "$LOC") (/count)})]
                          )
                        left_token: <Left_CommandSub "$(">
                        spids: [1676 1681]
                      )
                    }
                  spids: [1675]
                )
              ]
              spids: [1675]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REM_START)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [(C {(read_file)} {($ VSub_Name "$REM") (/count)})]
                          )
                        left_token: <Left_CommandSub "$(">
                        spids: [1685 1690]
                      )
                    }
                  spids: [1684]
                )
              ]
              spids: [1684]
            )
            (C {(sleep)} {(7)})
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:LOC_END)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [(C {(read_file)} {($ VSub_Name "$LOC") (/count)})]
                          )
                        left_token: <Left_CommandSub "$(">
                        spids: [1701 1706]
                      )
                    }
                  spids: [1700]
                )
              ]
              spids: [1700]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REM_END)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [(C {(read_file)} {($ VSub_Name "$REM") (/count)})]
                          )
                        left_token: <Left_CommandSub "$(">
                        spids: [1710 1715]
                      )
                    }
                  spids: [1709]
                )
              ]
              spids: [1709]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (AndOr
                          children: [
                            (DBracket
                              expr: 
                                (BoolBinary
                                  op_id: BoolBinary_GlobDEqual
                                  left: {($ VSub_Name "$LOC_START")}
                                  right: {($ VSub_Name "$LOC_END")}
                                )
                            )
                            (DBracket
                              expr: 
                                (BoolBinary
                                  op_id: BoolBinary_GlobDEqual
                                  left: {($ VSub_Name "$REM_START")}
                                  right: {($ VSub_Name "$REM_END")}
                                )
                            )
                          ]
                          op_id: Op_DPipe
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (SimpleCommand
                      words: [{(echo)} {(DQ ("Ping pong counter not incrementing!"))}]
                      redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[1753])]
                    )
                    (C {(exit)} {(1)})
                  ]
                  spids: [-1 1744]
                )
              ]
              spids: [-1 1762]
            )
            (C {(echo)} {(DQ ("  Passed"))})
          ]
          spids: [1644]
        )
      spids: [1638 1643]
    )
    (FuncDef
      name: perf_test
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:USE_DMA)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [1784]
                )
              ]
              spids: [1784]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {($ VSub_Name "$USE_DMA")}
                              right: {(DQ (1))}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:WITH)
                          op: Equal
                          rhs: {(DQ (with))}
                          spids: [1807]
                        )
                      ]
                      spids: [1807]
                    )
                  ]
                  spids: [-1 1804]
                )
              ]
              else_action: [
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:WITH)
                      op: Equal
                      rhs: {(DQ (without))}
                      spids: [1816]
                    )
                  ]
                  spids: [1816]
                )
              ]
              spids: [1813 1822]
            )
            (C {(_modprobe)} {(ntb_perf)} {(Lit_VarLike "run_order=") ($ VSub_Name "$PERF_RUN_ORDER")} 
              {(Lit_VarLike "max_mw_size=") ($ VSub_Name "$MAX_MW_SIZE")} {(Lit_VarLike "use_dma=") ($ VSub_Name "$USE_DMA")}
            )
            (C {(echo)} {(DQ ("Running local perf test ") ($ VSub_Name "$WITH") (" DMA"))})
            (C {(write_file)} {(DQ )} {($ VSub_Name "$LOCAL_PERF") (/run)})
            (C {(echo)} {(-n)} {(DQ ("  "))})
            (C {(read_file)} {($ VSub_Name "$LOCAL_PERF") (/run)})
            (C {(echo)} {(DQ ("  Passed"))})
            (C {(echo)} {(DQ ("Running remote perf test ") ($ VSub_Name "$WITH") (" DMA"))})
            (C {(write_file)} {(DQ )} {($ VSub_Name "$REMOTE_PERF") (/run)})
            (C {(echo)} {(-n)} {(DQ ("  "))})
            (C {(read_file)} {($ VSub_Name "$LOCAL_PERF") (/run)})
            (C {(echo)} {(DQ ("  Passed"))})
            (C {(_modprobe)} {(-r)} {(ntb_perf)})
          ]
          spids: [1781]
        )
      spids: [1775 1780]
    )
    (FuncDef
      name: ntb_tool_tests
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:LOCAL_TOOL)
                  op: Equal
                  rhs: {($ VSub_Name "$DEBUGFS") (/ntb_tool/) ($ VSub_Name "$LOCAL_DEV")}
                  spids: [1943]
                )
              ]
              spids: [1943]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REMOTE_TOOL)
                  op: Equal
                  rhs: 
                    {($ VSub_Name "$REMOTE_HOST") (Lit_Other ":") ($ VSub_Name "$DEBUGFS") 
                      (/ntb_tool/) ($ VSub_Name "$REMOTE_DEV")
                    }
                  spids: [1949]
                )
              ]
              spids: [1949]
            )
            (C {(echo)} {(DQ ("Starting ntb_tool tests..."))})
            (C {(_modprobe)} {(ntb_tool)})
            (C {(write_file)} {(Y)} {($ VSub_Name "$LOCAL_TOOL") (/link_event)})
            (C {(write_file)} {(Y)} {($ VSub_Name "$REMOTE_TOOL") (/link_event)})
            (C {(link_test)} {($ VSub_Name "$LOCAL_TOOL")} {($ VSub_Name "$REMOTE_TOOL")})
            (C {(link_test)} {($ VSub_Name "$REMOTE_TOOL")} {($ VSub_Name "$LOCAL_TOOL")})
            (ForEach
              iter_name: PEER_TRANS
              iter_words: [
                {
                  (CommandSubPart
                    command_list: 
                      (CommandList
                        children: [
                          (C {(ls)} {($ VSub_Name "$LOCAL_TOOL") (/peer_trans) (Lit_Other "*")})
                        ]
                      )
                    left_token: <Left_CommandSub "$(">
                    spids: [2010 2016]
                  )
                }
              ]
              do_arg_iter: False
              body: 
                (DoGroup
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:PT)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [(C {(basename)} {($ VSub_Name "$PEER_TRANS")})]
                                  )
                                left_token: <Left_CommandSub "$(">
                                spids: [2023 2027]
                              )
                            }
                          spids: [2022]
                        )
                      ]
                      spids: [2022]
                    )
                    (C {(write_file)} {($ VSub_Name "$MW_SIZE")} 
                      {($ VSub_Name "$LOCAL_TOOL") (/) ($ VSub_Name "$PT")}
                    )
                    (C {(write_file)} {($ VSub_Name "$MW_SIZE")} 
                      {($ VSub_Name "$REMOTE_TOOL") (/) ($ VSub_Name "$PT")}
                    )
                  ]
                  spids: [2019 2048]
                )
              spids: [2009 2017]
            )
            (C {(doorbell_test)} {($ VSub_Name "$LOCAL_TOOL")} {($ VSub_Name "$REMOTE_TOOL")})
            (C {(doorbell_test)} {($ VSub_Name "$REMOTE_TOOL")} {($ VSub_Name "$LOCAL_TOOL")})
            (C {(scratchpad_test)} {($ VSub_Name "$LOCAL_TOOL")} {($ VSub_Name "$REMOTE_TOOL")})
            (C {(scratchpad_test)} {($ VSub_Name "$REMOTE_TOOL")} {($ VSub_Name "$LOCAL_TOOL")})
            (ForEach
              iter_name: MW
              iter_words: [
                {
                  (CommandSubPart
                    command_list: 
                      (CommandList
                        children: [(C {(ls)} {($ VSub_Name "$LOCAL_TOOL") (/mw) (Lit_Other "*")})]
                      )
                    left_token: <Left_CommandSub "$(">
                    spids: [2087 2093]
                  )
                }
              ]
              do_arg_iter: False
              body: 
                (DoGroup
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:MW)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [(C {(basename)} {($ VSub_Name "$MW")})]
                                  )
                                left_token: <Left_CommandSub "$(">
                                spids: [2100 2104]
                              )
                            }
                          spids: [2099]
                        )
                      ]
                      spids: [2099]
                    )
                    (C {(mw_test)} {($ VSub_Name "$MW")} {($ VSub_Name "$LOCAL_TOOL")} 
                      {($ VSub_Name "$REMOTE_TOOL")}
                    )
                    (C {(mw_test)} {($ VSub_Name "$MW")} {($ VSub_Name "$REMOTE_TOOL")} 
                      {($ VSub_Name "$LOCAL_TOOL")}
                    )
                  ]
                  spids: [2096 2126]
                )
              spids: [2086 2094]
            )
            (C {(_modprobe)} {(-r)} {(ntb_tool)})
          ]
          spids: [1940]
        )
      spids: [1934 1939]
    )
    (FuncDef
      name: ntb_pingpong_tests
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:LOCAL_PP)
                  op: Equal
                  rhs: {($ VSub_Name "$DEBUGFS") (/ntb_pingpong/) ($ VSub_Name "$LOCAL_DEV")}
                  spids: [2148]
                )
              ]
              spids: [2148]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REMOTE_PP)
                  op: Equal
                  rhs: 
                    {($ VSub_Name "$REMOTE_HOST") (Lit_Other ":") ($ VSub_Name "$DEBUGFS") 
                      (/ntb_pingpong/) ($ VSub_Name "$REMOTE_DEV")
                    }
                  spids: [2154]
                )
              ]
              spids: [2154]
            )
            (C {(echo)} {(DQ ("Starting ntb_pingpong tests..."))})
            (C {(_modprobe)} {(ntb_pingpong)})
            (C {(pingpong_test)} {($ VSub_Name "$LOCAL_PP")} {($ VSub_Name "$REMOTE_PP")})
            (C {(_modprobe)} {(-r)} {(ntb_pingpong)})
          ]
          spids: [2145]
        )
      spids: [2139 2144]
    )
    (FuncDef
      name: ntb_perf_tests
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:LOCAL_PERF)
                  op: Equal
                  rhs: {($ VSub_Name "$DEBUGFS") (/ntb_perf/) ($ VSub_Name "$LOCAL_DEV")}
                  spids: [2203]
                )
              ]
              spids: [2203]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:REMOTE_PERF)
                  op: Equal
                  rhs: 
                    {($ VSub_Name "$REMOTE_HOST") (Lit_Other ":") ($ VSub_Name "$DEBUGFS") 
                      (/ntb_perf/) ($ VSub_Name "$REMOTE_DEV")
                    }
                  spids: [2209]
                )
              ]
              spids: [2209]
            )
            (C {(echo)} {(DQ ("Starting ntb_perf tests..."))})
            (C {(perf_test)} {(0)})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: (DBracket expr:(WordTest w:{($ VSub_Name "$RUN_DMA_TESTS")}))
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [(C {(perf_test)} {(1)})]
                  spids: [-1 2241]
                )
              ]
              spids: [-1 2249]
            )
          ]
          spids: [2200]
        )
      spids: [2194 2199]
    )
    (FuncDef
      name: cleanup
      body: 
        (BraceGroup
          children: [
            (C {(set)} {(Lit_Other "+") (e)})
            (SimpleCommand
              words: [{(_modprobe)} {(-r)} {(ntb_tool)}]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[2275])]
            )
            (SimpleCommand
              words: [{(_modprobe)} {(-r)} {(ntb_perf)}]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[2286])]
            )
            (SimpleCommand
              words: [{(_modprobe)} {(-r)} {(ntb_pingpong)}]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[2297])]
            )
            (SimpleCommand
              words: [{(_modprobe)} {(-r)} {(ntb_transport)}]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[2308])]
            )
            (C {(set)} {(-e)})
          ]
          spids: [2260]
        )
      spids: [2254 2259]
    )
    (C {(cleanup)})
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (Pipeline
                  children: [(DBracket expr:(WordTest w:{($ VSub_Dollar "$$") (DONT_CLEANUP)}))]
                  negated: True
                )
              terminator: <Op_Semi ";">
            )
          ]
          action: [(C {(trap)} {(cleanup)} {(EXIT)})]
          spids: [-1 2335]
        )
      ]
      spids: [-1 2344]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (C {(Lit_Other "[")} 
                  {
                    (DQ 
                      (CommandSubPart
                        command_list: (CommandList children:[(C {(id)} {(-u)})])
                        left_token: <Left_CommandSub "$(">
                        spids: [2352 2356]
                      )
                    )
                  } {(KW_Bang "!") (Lit_Other "=")} {(DQ (0))} {(Lit_Other "]")}
                )
              terminator: <Op_Semi ";">
            )
          ]
          action: [
            (SimpleCommand
              words: [{(echo)} {(DQ ("This script must be run as root"))}]
              redirects: [(Redir op_id:Redir_GreatAnd fd:1 arg_word:{(2)} spids:[2378])]
            )
            (C {(exit)} {(1)})
          ]
          spids: [-1 2369]
        )
      ]
      spids: [-1 2386]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (DBracket
                  expr: 
                    (BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {(DQ ($ VSub_Name "$LIST_DEVS"))}
                      right: {(TRUE)}
                    )
                )
              terminator: <Op_Semi ";">
            )
          ]
          action: [
            (C {(echo)} {(DQ ("Local Devices:"))})
            (C {(ls)} {(-1)} {(/sys/bus/ntb/devices)})
            (C {(echo)})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobNEqual
                              left: {(DQ ($ VSub_Name "$REMOTE_HOST"))}
                              right: {(DQ )}
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ("Remote Devices:"))})
                    (C {(ssh)} {($ VSub_Name "$REMOTE_HOST")} {(ls)} {(-1)} {(/sys/bus/ntb/devices)})
                  ]
                  spids: [-1 2441]
                )
              ]
              spids: [-1 2462]
            )
            (C {(exit)} {(0)})
          ]
          spids: [-1 2404]
        )
      ]
      spids: [-1 2470]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (AndOr
                  children: [
                    (DBracket
                      expr: 
                        (BoolBinary
                          op_id: BoolBinary_GlobDEqual
                          left: {(DQ ($ VSub_Name "$LOCAL_DEV"))}
                          right: {(DQ )}
                        )
                    )
                    (DBracket
                      expr: 
                        (BoolBinary
                          op_id: BoolBinary_GlobDEqual
                          left: {(DQ ($ VSub_Name "$REMOTE_DEV"))}
                          right: {(DQ )}
                        )
                    )
                  ]
                  op_id: Op_DPipe
                )
              terminator: <Op_Semi ";">
            )
          ]
          action: [(C {(show_help)}) (C {(exit)} {(1)})]
          spids: [-1 2504]
        )
      ]
      spids: [-1 2514]
    )
    (C {(ntb_tool_tests)})
    (C {(echo)})
    (C {(ntb_pingpong_tests)})
    (C {(echo)})
    (C {(ntb_perf_tests)})
    (C {(echo)})
  ]
)