logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Darmowe narzędzie do wyszukiwania identyfikatorów w złożonych programach?

_jta_ 26 Lip 2024 11:46 456 21
REKLAMA
  • #1 21168650
    _jta_
    Specjalista elektronik
    Posty: 48994
    Pomógł: 3209
    Ocena: 4237
    Czy jest takie (najlepiej darmowe) narzędzie do wyszukiwania identyfikatorów w programach złożonych z wielu plików tekstowych, żeby można było przeglądać tekst programu, kliknąć na identyfikator i zobaczyć, gdzie jeszcze i w jakim kontekście on występuje? Przydałoby się do języków HDL (Verilog, VHDL).
  • REKLAMA
  • #2 21168792
    LightOfWinter
    Poziom 38  
    Posty: 4385
    Pomógł: 366
    Ocena: 925
    Można używać komendy grep pod Linux-em
    https://www.ibm.com/docs/pl/aix/7.3?topic=g-grep-command

    Zapewne też środowisko Eclipse w swoim plugin do VHDL-a może mieć taką funkcjonalność.
    https://marketplace.eclipse.org/free-tagging/vhdl
  • REKLAMA
  • #3 21168813
    _jta_
    Specjalista elektronik
    Posty: 48994
    Pomógł: 3209
    Ocena: 4237
    Akurat grep-a znam, używam, ale jemu daleko do potrzebnej funkcjonalności.

    A co potrafi to eclipse, i jak go zainstalować i użyć, żeby to zobaczyć? Bo to mi wygląda na coś bardzo skomplikowanego do zainstalowania, a nie wiem, czy ma jakąś użyteczną dla mnie funkcjonalność.
  • #4 21168897
    namok
    Poziom 25  
    Posty: 529
    Pomógł: 91
    Ocena: 73
    Sprawdź geany.(https://geany.org/)
  • REKLAMA
  • #5 21168908
    LightOfWinter
    Poziom 38  
    Posty: 4385
    Pomógł: 366
    Ocena: 925
    namok napisał:
    Sprawdź geany.(https://geany.org/)

    Fajne, ale nie ma wsparcia dla VHDL-a.
    https://en.wikipedia.org/wiki/Geany
  • #6 21169010
    _jta_
    Specjalista elektronik
    Posty: 48994
    Pomógł: 3209
    Ocena: 4237
    Geany to jest edytor. O Verilog-u też nie widzę żadnej wzmianki w Wikipedii, jakkolwiek tu wymieniają zarówno Verilog, jak i VHDL. A co z przeglądaniem identyfikatorów? I w ilu plikach może ich szukać?

    Mi chodzi o przeglądanie i wskazywanie identyfikatorów - nie mylić z pokazywaniem syntaksy, to ma wiele edytorów, w tym np. joe, który jak na obecne komputery jest lekki i wygodny, a pokazuje syntaksę VHDL-u i Verilog-u.

    Problem jest taki, że na program, który mam poprawiać, składają się setki plików źródłowych - i chodzi mi o coś, co by pomagało znajdować w nich powiązania. Oczywiście, można dla każdego potrzebnego identyfikatora puszczać grep-a po tych wszystkich plikach, ale jest to dość czasochłonne, bo tych powiązań, które potrzebuję prześledzić, pewnie będzie sporo.

    Osobna sprawa, że ten sam obiekt w różnych plikach może mieć różne nazwy - w tym, identyfikator w VHDL-u zawierający duże litery odpowiada identyfikatorowi w Verilog-u zawierającemu wyłącznie małe (VHDL nie odróżnia małych i dużych liter, Verilog odróżnia, identyfikatorowi w Verilog-u zawierającemu duże litery nie odpowiada żaden identyfikator w VHDL-u - przy łączeniu kodu w tych językach identyfikatory w Verilog-u nie mogą zawierać dużych liter).

    Spróbowałem uruchomić geany, nie pokazał żadnych symboli (pisze "No symbols found") - jakim poleceniem kazać mu ich poszukać? Szukałem w opisie, w menu, nie znalazłem nic, co by sprawiało wrażenie, że to zrobi.

    Spróbowałem opcji "-g" - dostaję "Unknown filetype extension" i geany nie startuje. Chyba odpada...
  • #7 21169190
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1463
    _jta_ napisał:
    A co potrafi to eclipse, i jak go zainstalować i użyć, żeby to zobaczyć? Bo to mi wygląda na coś bardzo skomplikowanego do zainstalowania, a nie wiem, czy ma jakąś użyteczną dla mnie funkcjonalność.


    Nie tyle Eclipse, a raczej wbudowane analizery jezyka.
    W swoim czasie Eclipse to znaczący koń robczy dla firm integrujących różne rózniaste jezyki, w tym projektów elektroniki.

    Nawet edytory graficzne do tematów "bloczkowych" był osadzane w rozszerzeniach Eclipse (nie było ich w podstawowym pakiecie do podstawowego zakresu Javy, bo nie ma po co). Ty był koń do naprawdę zróżnicowanych bogatych systemów projektowych

    _jta_ napisał:
    Akurat grep-a znam, używam, ale jemu daleko do potrzebnej funkcjonalności.


    grep nigdy nie będzie ROZUMIAŁ języka w jakim teksty są, to tylko (dosc sprytne) narzędzie do szukania o stopień niżej *)

    Co więcej, narzędzie które rozpatruje każdy plik na dysku z osobna (nie integruje tego w swoim rozumku) też będzie tylko częściowe (R1 w różnych plikach oznacza coś innego)
    Tup tup ... to wraca idea drzewa semantycznego

    *) grep nie jest nawet pełnoprawnym lekserem w rozumieniu języków, ma minimalne elementy bezkontekstowej leksykalnosci. O semantyce zapomnieć

    Dodano po 5 [minuty]:

    _jta_ napisał:
    Bo to mi wygląda na coś bardzo skomplikowanego do zainstalowania


    We wszystkich watkach tak piszesz. Przyjmij do wiadomośći że temat jest niemały (pewnie może być ciekawy, w sensie wyzwania),
    I nie ma narzędzi "dla małego Jasia"

    Proste i o wielkim zakresie, to se ne da pane Havranek

    Dodano po 7 [minuty]:

    Dla ilustracji:
    nowoczesne IDE dla C#/Javy bardzo dobrze rozwiązuje zależności w obecnie otwartym wielożródłowym projekcie - jest znacznie słabsze nawet jeśli w kolejnym oknie otworzyć plik w tym samym języku. Właśnie w zewnętrznym pliku nie wiemy, co oznaczają zmienne (sorry, spłyciłem to do granicy prymitywizmu,. bo nie ma kontekstu)
  • REKLAMA
  • #8 21169607
    _jta_
    Specjalista elektronik
    Posty: 48994
    Pomógł: 3209
    Ocena: 4237
    Co znaczy "bardzo dobrze rozwiązuje zależności", "jest znacznie słabsze nawet jeśli w kolejnym oknie otworzyć plik w tym samym języku" - to jakiś bełkot.

    Napisałem w Python-ie dwa programiki, każdy około pół setki linii. Pierwszy wypisuje listę plików źródłowych projektu Vivado. Drugi je wczytuje, wyszukuje identyfikatory, sortuje, tworzy raport. I to jest duża pomoc w wyszukiwaniu zależności (choć mogłoby być znacznie lepiej - ale na to drugi programik musiałby być choć parę razy większy) - prawdopodobnie są one do tego znacznie bardziej użyteczne od wielkich systemów, których kształt nosi piętno manii wielkości ich twórców.

    Nie wiem, czy Koledzy używają takich języków, jak Verilog i VHDL - one mają specyficzne cechy, które ułatwiają znajdowanie zależności, o ile nie używa się argumentów dla obiektu z innego pliku jako pozycyjnych, a poprzez ich nazwy (bo wtedy te same nazwy występują w obu plikach i nie trzeba rozpoznawać semantyki).

    Ale może dość pisania o tym - Koledzy pewnie z tego nie potrafią skorzystać, pomysły na użycie wielkiego systemu mi się nie przydadzą - szkoda czasu i atłasu.

    Aha: ja do zarządzania projektem i do kompilacji (synteza, implementacja, generowanie binariów) używam Vivado. I Vivado oczywiście potrafi rozpoznawać całą semantykę - ale czy ma możliwość zrobienia z tego jakiegoś czytelnego raportu powiązań elementarnych obiektów? Zapewne taki raport byłby dużo lepszy od mojego. Niestety sam tego łatwo nie ustalę - opisy Vivado, to setki dokumentów, w sumie wiele tysięcy stron, nie do przeczytania w rozsądnym czasie.
  • #9 21170071
    jvoytech
    Poziom 22  
    Posty: 362
    Pomógł: 61
    Ocena: 136
    Może cos z programów do LSP (language server protocol) by się nadało? Na tej stronie verible znajdziesz server LSP do veriloga. W paczce jest kilka programów, np do formatowania kodu źródłowego, linter do sprawdzania jakości kodu, etc. Np. dla takiego prostego kodu:
    Kod: Verilog
    Zaloguj się, aby zobaczyć kod

    polecenie verible-verilog-syntax --printtree adder.v wygeneruje takie oto drzewo:
    
    Parse Tree:
    Node @0 (tag: kDescriptionList) {
      Node @0 (tag: kTimescaleDirective) {
        Leaf @0 (#"`timescale" @0-10: "`timescale")
        Node @1 (tag: kTimeLiteral) {
          Leaf @0 (#TK_TimeLiteral @11-14: "1ns")
        }
        Leaf @2 (#'/' @15-16: "/")
        Node @3 (tag: kTimeLiteral) {
          Leaf @0 (#TK_TimeLiteral @17-20: "1ns")
        }
      }
      Node @1 (tag: kPreprocessorInclude) {
        Leaf @0 (#"`include" @21-29: "`include")
        Leaf @1 (#TK_StringLiteral @30-39: ""adder.v"")
      }
      Node @2 (tag: kModuleDeclaration) {
        Node @0 (tag: kModuleHeader) {
          Leaf @0 (#"module" @41-47: "module")
          Leaf @2 (#SymbolIdentifier @48-56: "adder_tb")
          Leaf @7 (#';' @56-57: ";")
        }
        Node @1 (tag: kModuleItemList) {
          Node @0 (tag: kDataDeclaration) {
            Node @1 (tag: kInstantiationBase) {
              Node @0 (tag: kInstantiationType) {
                Node @0 (tag: kDataType) {
                  Node @1 (tag: kDataTypePrimitive) {
                    Leaf @0 (#"reg" @61-64: "reg")
                  }
                  Node @3 (tag: kPackedDimensions) {
                  }
                }
              }
              Node @1 (tag: kGateInstanceRegisterVariableList) {
                Node @0 (tag: kRegisterVariable) {
                  Leaf @0 (#SymbolIdentifier @66-67: "A")
                  Node @1 (tag: kUnpackedDimensions) {
                  }
                }
              }
            }
            Leaf @2 (#';' @67-68: ";")
          }
          Node @1 (tag: kDataDeclaration) {
            Node @1 (tag: kInstantiationBase) {
              Node @0 (tag: kInstantiationType) {
                Node @0 (tag: kDataType) {
                  Node @1 (tag: kDataTypePrimitive) {
                    Leaf @0 (#"reg" @71-74: "reg")
                  }
                  Node @3 (tag: kPackedDimensions) {
                  }
                }
              }
              Node @1 (tag: kGateInstanceRegisterVariableList) {
                Node @0 (tag: kRegisterVariable) {
                  Leaf @0 (#SymbolIdentifier @76-77: "B")
                  Node @1 (tag: kUnpackedDimensions) {
                  }
                }
              }
            }
            Leaf @2 (#';' @77-78: ";")
          }
          Node @2 (tag: kDataDeclaration) {
            Node @1 (tag: kInstantiationBase) {
              Node @0 (tag: kInstantiationType) {
                Node @0 (tag: kDataType) {
                  Node @1 (tag: kDataTypePrimitive) {
                    Leaf @0 (#"reg" @81-84: "reg")
                  }
                  Node @3 (tag: kPackedDimensions) {
                  }
                }
              }
              Node @1 (tag: kGateInstanceRegisterVariableList) {
                Node @0 (tag: kRegisterVariable) {
                  Leaf @0 (#SymbolIdentifier @86-89: "Cin")
                  Node @1 (tag: kUnpackedDimensions) {
                  }
                }
              }
            }
            Leaf @2 (#';' @89-90: ";")
          }
          Node @3 (tag: kNetDeclaration) {
            Node @0 (tag: kDataType) {
              Leaf @1 (#"wire" @94-98: "wire")
            }
            Node @2 (tag: kNetVariableDeclarationAssign) {
              Node @0 (tag: kNetVariable) {
                Leaf @0 (#SymbolIdentifier @99-100: "S")
                Node @1 (tag: kUnpackedDimensions) {
                }
              }
            }
            Leaf @3 (#';' @100-101: ";")
          }
          Node @4 (tag: kNetDeclaration) {
            Node @0 (tag: kDataType) {
              Leaf @1 (#"wire" @104-108: "wire")
            }
            Node @2 (tag: kNetVariableDeclarationAssign) {
              Node @0 (tag: kNetVariable) {
                Leaf @0 (#SymbolIdentifier @109-113: "Cout")
                Node @1 (tag: kUnpackedDimensions) {
                }
              }
            }
            Leaf @3 (#';' @113-114: ";")
          }
          Node @5 (tag: kDataDeclaration) {
            Node @1 (tag: kInstantiationBase) {
              Node @0 (tag: kInstantiationType) {
                Node @0 (tag: kDataType) {
                  Node @1 (tag: kLocalRoot) {
                    Node @0 (tag: kUnqualifiedId) {
                      Leaf @0 (#SymbolIdentifier @118-123: "adder")
                    }
                  }
                  Node @3 (tag: kPackedDimensions) {
                  }
                }
              }
              Node @1 (tag: kGateInstanceRegisterVariableList) {
                Node @0 (tag: kGateInstance) {
                  Leaf @0 (#SymbolIdentifier @124-127: "uut")
                  Node @1 (tag: kUnpackedDimensions) {
                  }
                  Node @2 (tag: kParenGroup) {
                    Leaf @0 (#'(' @128-129: "(")
                    Node @1 (tag: kPortActualList) {
                      Node @0 (tag: kActualNamedPort) {
                        Leaf @0 (#'.' @136-137: ".")
                        Leaf @1 (#SymbolIdentifier @137-138: "A")
                        Node @2 (tag: kParenGroup) {
                          Leaf @0 (#'(' @138-139: "(")
                          Node @1 (tag: kExpression) {
                            Node @0 (tag: kFunctionCall) {
                              Node @0 (tag: kReference) {
                                Node @0 (tag: kLocalRoot) {
                                  Node @0 (tag: kUnqualifiedId) {
                                    Leaf @0 (#SymbolIdentifier @139-140: "A")
                                  }
                                }
                              }
                            }
                          }
                          Leaf @2 (#')' @140-141: ")")
                        }
                      }
                      Leaf @1 (#',' @141-142: ",")
                      Node @2 (tag: kActualNamedPort) {
                        Leaf @0 (#'.' @149-150: ".")
                        Leaf @1 (#SymbolIdentifier @150-151: "B")
                        Node @2 (tag: kParenGroup) {
                          Leaf @0 (#'(' @151-152: "(")
                          Node @1 (tag: kExpression) {
                            Node @0 (tag: kFunctionCall) {
                              Node @0 (tag: kReference) {
                                Node @0 (tag: kLocalRoot) {
                                  Node @0 (tag: kUnqualifiedId) {
                                    Leaf @0 (#SymbolIdentifier @152-153: "B")
                                  }
                                }
                              }
                            }
                          }
                          Leaf @2 (#')' @153-154: ")")
                        }
                      }
                      Leaf @3 (#',' @154-155: ",")
                      Node @4 (tag: kActualNamedPort) {
                        Leaf @0 (#'.' @162-163: ".")
                        Leaf @1 (#SymbolIdentifier @163-166: "Cin")
                        Node @2 (tag: kParenGroup) {
                          Leaf @0 (#'(' @166-167: "(")
                          Node @1 (tag: kExpression) {
                            Node @0 (tag: kFunctionCall) {
                              Node @0 (tag: kReference) {
                                Node @0 (tag: kLocalRoot) {
                                  Node @0 (tag: kUnqualifiedId) {
                                    Leaf @0 (#SymbolIdentifier @167-170: "Cin")
                                  }
                                }
                              }
                            }
                          }
                          Leaf @2 (#')' @170-171: ")")
                        }
                      }
                      Leaf @5 (#',' @171-172: ",")
                      Node @6 (tag: kActualNamedPort) {
                        Leaf @0 (#'.' @179-180: ".")
                        Leaf @1 (#SymbolIdentifier @180-184: "Cout")
                        Node @2 (tag: kParenGroup) {
                          Leaf @0 (#'(' @184-185: "(")
                          Node @1 (tag: kExpression) {
                            Node @0 (tag: kFunctionCall) {
                              Node @0 (tag: kReference) {
                                Node @0 (tag: kLocalRoot) {
                                  Node @0 (tag: kUnqualifiedId) {
                                    Leaf @0 (#SymbolIdentifier @185-189: "Cout")
                                  }
                                }
                              }
                            }
                          }
                          Leaf @2 (#')' @189-190: ")")
                        }
                      }
                      Leaf @7 (#',' @190-191: ",")
                      Node @8 (tag: kActualNamedPort) {
                        Leaf @0 (#'.' @198-199: ".")
                        Leaf @1 (#SymbolIdentifier @199-200: "S")
                        Node @2 (tag: kParenGroup) {
                          Leaf @0 (#'(' @200-201: "(")
                          Node @1 (tag: kExpression) {
                            Node @0 (tag: kFunctionCall) {
                              Node @0 (tag: kReference) {
                                Node @0 (tag: kLocalRoot) {
                                  Node @0 (tag: kUnqualifiedId) {
                                    Leaf @0 (#SymbolIdentifier @201-202: "S")
                                  }
                                }
                              }
                            }
                          }
                          Leaf @2 (#')' @202-203: ")")
                        }
                      }
                    }
                    Leaf @2 (#')' @206-207: ")")
                  }
                }
              }
            }
            Leaf @2 (#';' @207-208: ";")
          }
          Node @6 (tag: kInitialStatement) {
            Leaf @0 (#"initial" @212-219: "initial")
            Node @1 (tag: kSeqBlock) {
              Node @0 (tag: kBegin) {
                Leaf @0 (#"begin" @220-225: "begin")
              }
              Node @1 (tag: kBlockItemStatementList) {
                Node @0 (tag: kStatement) {
                  Node @0 (tag: kSystemTFCall) {
                    Leaf @0 (#SystemTFIdentifier @230-238: "$display")
                    Node @1 (tag: kParenGroup) {
                      Leaf @0 (#'(' @238-239: "(")
                      Node @1 (tag: kArgumentList) {
                        Node @0 (tag: kExpression) {
                          Leaf @0 (#TK_StringLiteral @239-267: ""+---+---+-----+---+------+"")
                        }
                      }
                      Leaf @2 (#')' @267-268: ")")
                    }
                  }
                  Leaf @1 (#';' @268-269: ";")
                }
                Node @1 (tag: kStatement) {
                  Node @0 (tag: kSystemTFCall) {
                    Leaf @0 (#SystemTFIdentifier @274-282: "$display")
                    Node @1 (tag: kParenGroup) {
                      Leaf @0 (#'(' @282-283: "(")
                      Node @1 (tag: kArgumentList) {
                        Node @0 (tag: kExpression) {
                          Leaf @0 (#TK_StringLiteral @283-311: ""| A | B | Cin | S | Cout |"")
                        }
                      }
                      Leaf @2 (#')' @311-312: ")")
                    }
                  }
                  Leaf @1 (#';' @312-313: ";")
                }
                Node @2 (tag: kStatement) {
                  Node @0 (tag: kSystemTFCall) {
                    Leaf @0 (#SystemTFIdentifier @318-326: "$display")
                    Node @1 (tag: kParenGroup) {
                      Leaf @0 (#'(' @326-327: "(")
                      Node @1 (tag: kArgumentList) {
                        Node @0 (tag: kExpression) {
                          Leaf @0 (#TK_StringLiteral @327-355: ""+---+---+-----+---+------+"")
                        }
                      }
                      Leaf @2 (#')' @355-356: ")")
                    }
                  }
                  Leaf @1 (#';' @356-357: ";")
                }
                Node @3 (tag: kForLoopStatement) {
                  Node @0 (tag: kLoopHeader) {
                    Leaf @0 (#"for" @362-365: "for")
                    Node @1 (tag: kParenGroup) {
                      Leaf @0 (#'(' @366-367: "(")
                      Node @1 (tag: kForSpec) {
                        Node @0 (tag: kForInitializationList) {
                          Node @0 (tag: kForInitialization) {
                            Node @1 (tag: kDataType) {
                              Node @1 (tag: kDataTypePrimitive) {
                                Leaf @0 (#"integer" @367-374: "integer")
                              }
                              Node @3 (tag: kPackedDimensions) {
                              }
                            }
                            Leaf @2 (#SymbolIdentifier @375-376: "i")
                            Leaf @3 (#'=' @377-378: "=")
                            Node @4 (tag: kExpression) {
                              Node @0 (tag: kNumber) {
                                Leaf @0 (#TK_DecNumber @379-380: "0")
                              }
                            }
                          }
                        }
                        Leaf @1 (#';' @380-381: ";")
                        Node @2 (tag: kForCondition) {
                          Node @0 (tag: kExpression) {
                            Node @0 (tag: kBinaryExpression) {
                              Node @0 (tag: kFunctionCall) {
                                Node @0 (tag: kReference) {
                                  Node @0 (tag: kLocalRoot) {
                                    Node @0 (tag: kUnqualifiedId) {
                                      Leaf @0 (#SymbolIdentifier @382-383: "i")
                                    }
                                  }
                                }
                              }
                              Leaf @1 (#'<' @384-385: "<")
                              Node @2 (tag: kNumber) {
                                Leaf @0 (#TK_DecNumber @386-387: "8")
                              }
                            }
                          }
                        }
                        Leaf @3 (#';' @387-388: ";")
                        Node @4 (tag: kForStepList) {
                          Node @0 (tag: kNetVariableAssignment) {
                            Node @0 (tag: kLPValue) {
                              Node @0 (tag: kReference) {
                                Node @0 (tag: kLocalRoot) {
                                  Node @0 (tag: kUnqualifiedId) {
                                    Leaf @0 (#SymbolIdentifier @389-390: "i")
                                  }
                                }
                              }
                            }
                            Leaf @1 (#'=' @391-392: "=")
                            Node @2 (tag: kExpression) {
                              Node @0 (tag: kBinaryExpression) {
                                Node @0 (tag: kFunctionCall) {
                                  Node @0 (tag: kReference) {
                                    Node @0 (tag: kLocalRoot) {
                                      Node @0 (tag: kUnqualifiedId) {
                                        Leaf @0 (#SymbolIdentifier @393-394: "i")
                                      }
                                    }
                                  }
                                }
                                Leaf @1 (#'+' @395-396: "+")
                                Node @2 (tag: kNumber) {
                                  Leaf @0 (#TK_DecNumber @397-398: "1")
                                }
                              }
                            }
                          }
                        }
                      }
                      Leaf @2 (#')' @398-399: ")")
                    }
                  }
                  Node @1 (tag: kSeqBlock) {
                    Node @0 (tag: kBegin) {
                      Leaf @0 (#"begin" @400-405: "begin")
                    }
                    Node @1 (tag: kBlockItemStatementList) {
                      Node @0 (tag: kNetVariableAssignment) {
                        Node @0 (tag: kLPValue) {
                          Node @0 (tag: kBraceGroup) {
                            Leaf @0 (#'{' @412-413: "{")
                            Node @1 (tag: kOpenRangeList) {
                              Node @0 (tag: kExpression) {
                                Node @0 (tag: kFunctionCall) {
                                  Node @0 (tag: kReference) {
                                    Node @0 (tag: kLocalRoot) {
                                      Node @0 (tag: kUnqualifiedId) {
                                        Leaf @0 (#SymbolIdentifier @413-414: "A")
                                      }
                                    }
                                  }
                                }
                              }
                              Leaf @1 (#',' @414-415: ",")
                              Node @2 (tag: kExpression) {
                                Node @0 (tag: kFunctionCall) {
                                  Node @0 (tag: kReference) {
                                    Node @0 (tag: kLocalRoot) {
                                      Node @0 (tag: kUnqualifiedId) {
                                        Leaf @0 (#SymbolIdentifier @416-417: "B")
                                      }
                                    }
                                  }
                                }
                              }
                              Leaf @3 (#',' @417-418: ",")
                              Node @4 (tag: kExpression) {
                                Node @0 (tag: kFunctionCall) {
                                  Node @0 (tag: kReference) {
                                    Node @0 (tag: kLocalRoot) {
                                      Node @0 (tag: kUnqualifiedId) {
                                        Leaf @0 (#SymbolIdentifier @419-422: "Cin")
                                      }
                                    }
                                  }
                                }
                              }
                            }
                            Leaf @2 (#'}' @422-423: "}")
                          }
                        }
                        Leaf @1 (#'=' @424-425: "=")
                        Node @2 (tag: kExpression) {
                          Node @0 (tag: kFunctionCall) {
                            Node @0 (tag: kReference) {
                              Node @0 (tag: kLocalRoot) {
                                Node @0 (tag: kUnqualifiedId) {
                                  Leaf @0 (#SymbolIdentifier @426-427: "i")
                                }
                              }
                            }
                          }
                        }
                        Leaf @3 (#';' @427-428: ";")
                      }
                      Node @1 (tag: kProceduralTimingControlStatement) {
                        Node @0 (tag: kDelay) {
                          Leaf @0 (#'#' @435-436: "#")
                          Node @1 (tag: kDelayValue) {
                            Leaf @0 (#TK_DecNumber @436-438: "10")
                          }
                        }
                        Node @1 (tag: kNullStatement) {
                          Leaf @0 (#';' @438-439: ";")
                        }
                      }
                      Node @2 (tag: kStatement) {
                        Node @0 (tag: kSystemTFCall) {
                          Leaf @0 (#SystemTFIdentifier @446-454: "$display")
                          Node @1 (tag: kParenGroup) {
                            Leaf @0 (#'(' @454-455: "(")
                            Node @1 (tag: kArgumentList) {
                              Node @0 (tag: kExpression) {
                                Leaf @0 (#TK_StringLiteral @455-488: ""| %b | %b |  %b  | %b |  %b   |"")
                              }
                              Leaf @1 (#',' @488-489: ",")
                              Node @2 (tag: kExpression) {
                                Node @0 (tag: kFunctionCall) {
                                  Node @0 (tag: kReference) {
                                    Node @0 (tag: kLocalRoot) {
                                      Node @0 (tag: kUnqualifiedId) {
                                        Leaf @0 (#SymbolIdentifier @490-491: "A")
                                      }
                                    }
                                  }
                                }
                              }
                              Leaf @3 (#',' @491-492: ",")
                              Node @4 (tag: kExpression) {
                                Node @0 (tag: kFunctionCall) {
                                  Node @0 (tag: kReference) {
                                    Node @0 (tag: kLocalRoot) {
                                      Node @0 (tag: kUnqualifiedId) {
                                        Leaf @0 (#SymbolIdentifier @493-494: "B")
                                      }
                                    }
                                  }
                                }
                              }
                              Leaf @5 (#',' @494-495: ",")
                              Node @6 (tag: kExpression) {
                                Node @0 (tag: kFunctionCall) {
                                  Node @0 (tag: kReference) {
                                    Node @0 (tag: kLocalRoot) {
                                      Node @0 (tag: kUnqualifiedId) {
                                        Leaf @0 (#SymbolIdentifier @496-499: "Cin")
                                      }
                                    }
                                  }
                                }
                              }
                              Leaf @7 (#',' @499-500: ",")
                              Node @8 (tag: kExpression) {
                                Node @0 (tag: kFunctionCall) {
                                  Node @0 (tag: kReference) {
                                    Node @0 (tag: kLocalRoot) {
                                      Node @0 (tag: kUnqualifiedId) {
                                        Leaf @0 (#SymbolIdentifier @501-502: "S")
                                      }
                                    }
                                  }
                                }
                              }
                              Leaf @9 (#',' @502-503: ",")
                              Node @10 (tag: kExpression) {
                                Node @0 (tag: kFunctionCall) {
                                  Node @0 (tag: kReference) {
                                    Node @0 (tag: kLocalRoot) {
                                      Node @0 (tag: kUnqualifiedId) {
                                        Leaf @0 (#SymbolIdentifier @504-508: "Cout")
                                      }
                                    }
                                  }
                                }
                              }
                            }
                            Leaf @2 (#')' @508-509: ")")
                          }
                        }
                        Leaf @1 (#';' @509-510: ";")
                      }
                    }
                    Node @2 (tag: kEnd) {
                      Leaf @0 (#"end" @515-518: "end")
                    }
                  }
                }
                Node @4 (tag: kStatement) {
                  Node @0 (tag: kSystemTFCall) {
                    Leaf @0 (#SystemTFIdentifier @523-531: "$display")
                    Node @1 (tag: kParenGroup) {
                      Leaf @0 (#'(' @531-532: "(")
                      Node @1 (tag: kArgumentList) {
                        Node @0 (tag: kExpression) {
                          Leaf @0 (#TK_StringLiteral @532-560: ""+---+---+-----+---+------+"")
                        }
                      }
                      Leaf @2 (#')' @560-561: ")")
                    }
                  }
                  Leaf @1 (#';' @561-562: ";")
                }
                Node @5 (tag: kStatement) {
                  Node @0 (tag: kSystemTFCall) {
                    Leaf @0 (#SystemTFIdentifier @567-574: "$finish")
                  }
                  Leaf @1 (#';' @574-575: ";")
                }
              }
              Node @2 (tag: kEnd) {
                Leaf @0 (#"end" @578-581: "end")
              }
            }
          }
        }
        Leaf @2 (#"endmodule" @583-592: "endmodule")
      }
      Node @3 (tag: kNullItem) {
        Leaf @0 (#';' @593-594: ";")
      }
    }
    

    albo generacja tokenów verible-verilog-syntax --printtokens adder.v | grep SymbolIdentifier
    (#SymbolIdentifier @48-56: "adder_tb")
    (#SymbolIdentifier @66-67: "A")
    (#SymbolIdentifier @76-77: "B")
    (#SymbolIdentifier @86-89: "Cin")
    (#SymbolIdentifier @99-100: "S")
    (#SymbolIdentifier @109-113: "Cout")
    (#SymbolIdentifier @118-123: "adder")
    (#SymbolIdentifier @124-127: "uut")
    (#SymbolIdentifier @137-138: "A")
    (#SymbolIdentifier @139-140: "A")
    (#SymbolIdentifier @150-151: "B")
    (#SymbolIdentifier @152-153: "B")
    (#SymbolIdentifier @163-166: "Cin")
    (#SymbolIdentifier @167-170: "Cin")
    (#SymbolIdentifier @180-184: "Cout")
    (#SymbolIdentifier @185-189: "Cout")
    (#SymbolIdentifier @199-200: "S")
    (#SymbolIdentifier @201-202: "S")
    (#SymbolIdentifier @375-376: "i")
    (#SymbolIdentifier @382-383: "i")
    (#SymbolIdentifier @389-390: "i")
    (#SymbolIdentifier @393-394: "i")
    (#SymbolIdentifier @413-414: "A")
    (#SymbolIdentifier @416-417: "B")
    (#SymbolIdentifier @419-422: "Cin")
    (#SymbolIdentifier @426-427: "i")
    (#SymbolIdentifier @490-491: "A")
    (#SymbolIdentifier @493-494: "B")
    (#SymbolIdentifier @496-499: "Cin")
    (#SymbolIdentifier @501-502: "S")
    (#SymbolIdentifier @504-508: "Cout")
    
  • #10 21170104
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1463
    _jta_ napisał:
    opisy Vivado, to setki dokumentów, w sumie wiele tysięcy stron, nie do przeczytania w rozsądnym czasie.


    Prawdopodobnie ma to jakieś spisy treści, i wiadomo czego nie czytać.
    Bijesz się z obszerną materią, czy to okoliczności do obrażania się na dokumentację ?
    Chcesz zrobić produkt "lepszy niż ich", nie wiedząc jak jest "ich" zrobiony i jak naprawdę działa ???

    Dodano po 54 [sekundy]:

    jvoytech napisał:
    Może cos z programów do LSP (language server protocol) by się nadało?


    To dobra, w sensie perspektywiczna porada. Podkreśliłem, bo kol oczekuje usmażonej ryby a nie wędki.
    Mimo że kol @_jta jest obrażony na dorobek branży translatorów / teorii paserów, LSP to być może słuszna ścieżka
  • #11 21170502
    _jta_
    Specjalista elektronik
    Posty: 48994
    Pomógł: 3209
    Ocena: 4237
    JacekCz napisał:
    nie wiedząc jak jest "ich" zrobiony i jak naprawdę działa ???

    To ich sprawa, żeby mi przekazać informację - jak nie ma informacji, to z jakiej racji mam zakładać, że jest lepszy? Zakładam, że jakby coś tam było dobrego, to by się tym pochwalili - bo firmy zwykle tak robią. A nie jestem w stanie poznawać wszystkiego. Oczywiście, nie zakładam, że sam wszystko wiem - dlatego pytam. Ale skoro Koledzy mi nic sensownego nie napisali...

    JacekCz napisał:
    Mimo że kol @_jta jest obrażony na dorobek branży translatorów / teorii paserów, LSP to być może słuszna ścieżka

    Nie jestem obrażony, tylko znam wady podejścia, które w moim odczuciu jest skutkiem manii wielkości i niestety bywa dość rozpowszechnione. Być może Kolega jeszcze tych wad nie rozpoznał. A ja nie mam tyle czasu, by je Koledze wytłumaczyć.

    Jak znajdę trochę czasu, to popatrzę na to verible - akurat większość mam w Verilogu (właśnie zgadywałem, co znaczy "a || |b"?).
  • #12 21170729
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1463
    _jta_ napisał:
    JacekCz"]Mimo że kol @_jta jest obrażony na dorobek branży translatorów / teorii paserów, LSP to być może słuszna ścieżka

    Nie jestem obrażony, tylko znam wady podejścia, które w moim odczuciu jest skutkiem manii wielkości i niestety bywa dość rozpowszechnione.[/quote]


    Tyyyyy .... to ciekawe, bo ja dokładnie tych samych słów używam o Zosiachsamosiach, np taka logika:

    _jta_ napisał:
    To ich sprawa, żeby mi przekazać informację - jak nie ma informacji, to z jakiej racji mam zakładać, że jest lepszy?

    Przekaanie informacji specjalistycznej komuś, kto jej nie chce jest "trochę trudne". To ma nazwę materiału budowlanego

    A trochę mniej emocjonalnie:
    _jta_ napisał:
    Zakładam, że jakby coś tam było dobrego, to by się tym pochwalili - bo firmy zwykle tak robią.


    Dlaczego firmy co do ogromnego produktu dla specjalistów - i niszowej funkcjonalności, bo kolejny wątek bardzo niszowy - mieli by kupować czas reklamowy w telewizjach w najlepszym czasie reklamowym ??? Produkt ogromny, niszowych ficzerów ma tysiace. Naprawdę "oni mają szukać czytelnika" ?
  • #13 21171008
    _jta_
    Specjalista elektronik
    Posty: 48994
    Pomógł: 3209
    Ocena: 4237
    JacekCz napisał:
    Dlaczego firmy co do ogromnego produktu dla specjalistów - i niszowej funkcjonalności, bo kolejny wątek bardzo niszowy - mieli by kupować czas reklamowy w telewizjach

    Nie chodzi mi o reklamę, tylko o przyzwoity opis (Kolega zna różnicę?). Szukałem takiego, nie znalazłem. Rozumiem, że do zrobienia opisu potrzeba kogoś, kto rozumie to, co ma być opisane - ale jak w firmie nikogo takiego nie ma, to jak ma powstać sensowne oprogramowanie?

    Firmy zatrudniają speców od reklam i produkują reklamy - aż za dużo, i ja zwykle daremnie próbuję między tymi reklamami znaleźć kawałek opisu.

    Tu pewnie rozwiązaniem znacznie lepszym od tego, co sam zrobiłem, byłoby zrobienie syntezy całości w Vivado, gdyby wynik tej syntezy mógł być przetworzony na postać, którą bym mógł wczytać do swojego programu. Ale nie trafiłem na informację, jak można to zrobić.

    Zajrzałem na stronę Xilinx-a (teraz AMD) i wpisałem do wyszukiwarki dokumentów "Vivado" i język angielski - 43 028 wyników; z ograniczeniem do kategorii User Guide - 16 733...

    W Wikipedii po polsku jest Xilinx Netlist Format - niestety bez konkretnych informacji, linków do szczegółów, itp.
  • #16 21180304
    jestam
    Specjalista Automatyk
    Posty: 1799
    Pomógł: 210
    Ocena: 145
    Instalujesz VSCode - jest wersja dla Linux. Instalujesz rozszerzenie do Veriloga. Poczytaj jego dokumentację, może coś trzeba skofigurować.

    Otwierasz w edytorze folder z plikami projektu, czekasz aż się symbole zindeksują.

    Otwierasz plik. Wskazujesz symbol, klikasz "Find all references", edytor wskazuje wszystkie odwołania, zgodnie z semantyką języka.

    Nie wiem na ile kompletne jest to rozszerzenie z mojego linku, nie używałem go, ale polecają na Stackoverflow. Są też inne rozszerzenia, możesz poeksperymentować.

    Dla VHDL pewnie też znajdziesz jakieś rozszerzenie.
  • #18 21180400
    jestam
    Specjalista Automatyk
    Posty: 1799
    Pomógł: 210
    Ocena: 145
    W pierwszym poście pisałeś o pracy interaktywnej
    _jta_ napisał:
    kliknąć na identyfikator i zobaczyć, gdzie jeszcze i w jakim kontekście on występuje

    Jeśli chcesz to oskryptować, to widzę takie ścieżki, od najłatwiejszej do najtrudniejszej:
    1. rozszerzyć edytor i rozmawiać z Language Service przez API edytora;
    2. zaimplementować LSP i rozmawiać z Language Service przez LSP;
    3. zaimplementować własny parser.

    (Edit: literówka)
  • #19 21181113
    _jta_
    Specjalista elektronik
    Posty: 48994
    Pomógł: 3209
    Ocena: 4237
    Vivado to nieco ciężka machina, ale może wykonywać skrypty w Tcl-u, np.
    Kod: Tcl
    Zaloguj się, aby zobaczyć kod

    Trzeba odróżnić "synth_design" w użytej tu wersji, która zachowuje strukturę elementów z plików źródłowych od pełnej syntezy, która upraszcza strukturę przynajmniej tam, gdzie sprowadza się ona do połączeń - to tworzy elementy generowane przez syntezę, których nazwy nie kojarzą się z tymi ze źródeł.

    Pewnie dla źródeł w Verilog-u i System Verilogu też to zadziała, ale zacząłem od VHDL.
  • #20 21183135
    _jta_
    Specjalista elektronik
    Posty: 48994
    Pomógł: 3209
    Ocena: 4237
    Mam jednak pewien problem: niektóre pliki projektu są zaszyfrowane, synteza sobie z tym radzi, ale "synth_design" nie. Co z tym robić?

    Vivado zna ten szyfr, więc odszyfrowuje podczas syntezy, ale to jest szyfr specyficzny dla Vivado i pewnie nic innego go nie łyknie.

    Przydałoby się móc wyodrębnić z projektu te zaszyfrowane pliki, zrobić z nich syntezę i zapisać razem z interfejsem w Verilog-u/VHDL-u - tak, jak Vivado zwykle zapisuje wynik syntezy - czyli plik DCP zawierający jakieś binaria i pliki interfejsu - wtedy "synth_design" z -rtl (wygląda na to, że ta opcja jest istotna) mógłby czytać te pliki interfejsu i pozwolić na analizę całości (z wyłączeniem tego, co jest w plikach binarnych); jest jeszcze jakaś opcja dla "synth_design", która z analizy wyłącza importowane IP, może jest potrzebna, żeby brak dostępu do tego, co jest w tych plikach binarnych, nie przeszkodził w wykonaniu analizy całej reszty.

    Tylko nie mogę dojść, jak wywołać syntezę dla wskazanych plików projektu. Jakoś to się robi, w projekcie jest część, którą się syntetyzuje oddzielnie.
  • #21 21186609
    _jta_
    Specjalista elektronik
    Posty: 48994
    Pomógł: 3209
    Ocena: 4237
    Vivado ma jakieś narzędzia do oglądania źródeł programu i znajdowania obiektów - np. można wygenerować schemat, kliknąć na 'celę' i kazać pokazać jej instancję i definicję. Tylko sporo czasu zajmuje dokopanie się do informacji, jak to się robi - to niestety jest wada dużych narzędzi...
  • #22 21204538
    _jta_
    Specjalista elektronik
    Posty: 48994
    Pomógł: 3209
    Ocena: 4237
    I mam jeszcze jeden problem: mam jakiś plik źródłowy, chciałbym go dołączyć do projektu i w tym celu chcę dostać jego interfejs. Próbuję to robić używając Vivado: wstawiam plik do projektu, każę zrobić syntezę RTL (synth_design -rtl, ewentualnie z -mode out_of_context) i dostaję błąd - że sygnał nie jest podłączony. Ale ja chcę właśnie dostać informację, jaki sygnał mogę podłączyć! Co z tym robić?

    Coś wykryłem: to zależy od rodzaju sygnałów, nie są dozwolone sygnały wektorowe o niezdefiniowanym rozmiarze, jak się zdefiniuje rozmiar wektora, to synteza przechodzi (jeśli plik jest zaszyfrowany, to nie można zrobić syntezy RTL).

    I nawet nie jest konieczny projekt - można tak: startuję Vivado, dodaję plik, każę zrobić syntezę, i potem "get_ports -of [get_cells]" daje mi listę wejść i wyjść (o to, co jest czym, trzeba zapytać oddzielnie, np. o kierunek przesyłania używając "get_property DIRECTION <port>", przekazując port z tego, co zwróci "get_ports", nie mylić z przekazaniem nazwy, choć w konsoli Tcl nie widać różnicy). Aha: przy robieniu syntezy trzeba podać top - można użyć "find_top", żeby go dostać. Ostatecznie:
    Kod: Tcl
    Zaloguj się, aby zobaczyć kod

    Ale top nie może mieć argumentu o nieokreślonym rozmiarze.

Podsumowanie tematu

✨ Użytkownik poszukuje darmowego narzędzia do analizy identyfikatorów w złożonych programach napisanych w językach HDL, takich jak Verilog i VHDL. W odpowiedziach zasugerowano użycie komendy grep w systemie Linux, jednak użytkownik zauważył, że nie spełnia ona jego potrzeb. Wskazano również na możliwość wykorzystania środowiska Eclipse z odpowiednim pluginem do VHDL oraz edytora Geany, chociaż ten ostatni nie obsługuje VHDL. Użytkownik rozważał także Language Server Protocol (LSP) i narzędzie Verible do Veriloga, które może pomóc w analizie kodu. Wspomniano o Visual Studio Code jako edytorze, który wspiera LSP i umożliwia przeszukiwanie identyfikatorów w projektach. Użytkownik podkreślił, że potrzebuje narzędzia do analizy, a nie tylko do edycji, oraz że napotkał problemy z zaszyfrowanymi plikami w Vivado, które utrudniają syntezę i analizę kodu.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA