⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.xs

📁 Verilog Parser in Perl
💻 XS
📖 第 1 页 / 共 2 页
字号:
#/* Verilog.xs -- Verilog Booter  -*- C++ -*-#*********************************************************************#*#* DESCRIPTION: Verilog::Parser Perl XS interface#*#* Author: Wilson Snyder <wsnyder@wsnyder.org>#*#* Code available from: http://www.veripool.org/#*#*********************************************************************#*#* Copyright 2000-2009 by Wilson Snyder.  This program is free software;#* you can redistribute it and/or modify it under the terms of either the GNU#* Lesser General Public License or the Perl Artistic License.#*#* This program is distributed in the hope that it will be useful,#* but WITHOUT ANY WARRANTY; without even the implied warranty of#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the#* GNU General Public License for more details.#*#* You should have received a copy of the Perl Artistic License#* along with this module; see the file COPYING.  If not, see#* www.cpan.org#*#***********************************************************************#* Note with C++ XS libraries, the CLASS parameter is implied...#***********************************************************************//* Mine: */#include "VParse.h"/* Perl */extern "C" {# include "EXTERN.h"# include "perl.h"# include "XSUB.h"}#ifdef open# undef open	/* Perl 64 bit on solaris has a nasty hack that redefines open */#endif#//**********************************************************************#// Parseressor derived classes, so we can override the callbacks to call perl.class VParserXs : public VParse {public:    SV*		m_self;	// Class called from    VFileLine*	m_cbFilelinep;	///< Last callback's starting point    VFileLine* cbFilelinep() const { return m_cbFilelinep; }    void cbFileline(const string& filename, int lineno) { m_cbFilelinep = m_cbFilelinep->create(filename, lineno); }    void cbFileline(VFileLine* filelinep) { m_cbFilelinep = filelinep; }    VParserXs(VFileLine* filelinep, bool sigparser, bool useUnreadbackFlag)	: VParse(filelinep, sigparser, useUnreadbackFlag)	  , m_cbFilelinep(filelinep)	{}    virtual ~VParserXs() {}    // Verilog::Parser Callback methods    virtual void attributeCb(VFileLine* fl, const string& text);    virtual void commentCb(VFileLine* fl, const string& text);    virtual void endparseCb(VFileLine* fl);    virtual void keywordCb(VFileLine* fl, const string& text);    virtual void numberCb(VFileLine* fl, const string& text);    virtual void operatorCb(VFileLine* fl, const string& text);    virtual void preprocCb(VFileLine* fl, const string& text);    virtual void stringCb(VFileLine* fl, const string& text);    virtual void symbolCb(VFileLine* fl, const string& text);    virtual void sysfuncCb(VFileLine* fl, const string& text);    // Verilog::SigParser Callback methods    virtual void endcellCb(VFileLine* fl, const string& kwd);    virtual void endinterfaceCb(VFileLine* fl, const string& kwd);    virtual void endmoduleCb(VFileLine* fl, const string& kwd);    virtual void endpackageCb(VFileLine* fl, const string& kwd);    virtual void endtaskfuncCb(VFileLine* fl, const string& kwd);    virtual void functionCb(VFileLine* fl, const string& kwd, const string& name, const string& type);    virtual void importCb(VFileLine* fl, const string& name);    virtual void instantCb(VFileLine* fl, const string& mod, const string& cell, const string& range);    virtual void interfaceCb(VFileLine* fl, const string& kwd, const string& name);    virtual void moduleCb(VFileLine* fl, const string& kwd, const string& name, bool celldefine);    virtual void packageCb(VFileLine* fl, const string& kwd, const string& name);    virtual void paramPinCb(VFileLine* fl, const string& name, const string& conn, int number);    virtual void pinCb(VFileLine* fl, const string& name, const string& conn, int number);    virtual void portCb(VFileLine* fl, const string& name);    virtual void signalCb(VFileLine* fl, const string& kwd, const string& name,			  const string& vec, const string& mem, const string& signd,			  const string& value,			  bool inFunc);    virtual void taskCb(VFileLine* fl, const string& kwd, const string& name);    void call(string* rtnStrp, int params, const char* method, ...);};class VFileLineParseXs : public VFileLine {    VParserXs*	m_vParserp;		// Parser handling the errorspublic:    VFileLineParseXs(int called_only_for_default) : VFileLine(called_only_for_default) {}    virtual ~VFileLineParseXs() { }    virtual VFileLine* create(const string filename, int lineno);    virtual void error(const string msg);	// Report a error at given location    void setParser(VParserXs* pp) { m_vParserp=pp; }};#//**********************************************************************#// Overrides error handling virtual functions to invoke callbacksVFileLine* VFileLineParseXs::create(const string filename, int lineno) {    VFileLineParseXs* filelp = new VFileLineParseXs(true);    filelp->init(filename, lineno);    filelp->m_vParserp = m_vParserp;    return filelp;}void VFileLineParseXs::error(string msg) {    static string holdmsg; holdmsg = msg;    m_vParserp->cbFileline(this);    m_vParserp->call(NULL, 1,"error",holdmsg.c_str());}#//**********************************************************************#// Overrides of virtual functions to invoke callbacks// Verilog::Parser Callback methodsvoid VParserXs::attributeCb(VFileLine* fl, const string& text) {    cbFileline(fl);    static string hold1; hold1 = text;    call(NULL, 1,"attribute",hold1.c_str());}void VParserXs::commentCb(VFileLine* fl, const string& text) {    cbFileline(fl);    static string hold1; hold1 = text;    call(NULL, 1,"comment",hold1.c_str());}void VParserXs::endparseCb(VFileLine* fl) {    cbFileline(fl);    call(NULL, 1,"endparse","");}void VParserXs::keywordCb(VFileLine* fl, const string& text) {    cbFileline(fl);    static string hold1; hold1 = text;    call(NULL, 1,"keyword",hold1.c_str());}void VParserXs::numberCb(VFileLine* fl, const string& text) {    cbFileline(fl);    static string hold1; hold1 = text;    call(NULL, 1,"number",hold1.c_str());}void VParserXs::operatorCb(VFileLine* fl, const string& text) {    cbFileline(fl);    static string hold1; hold1 = text;    call(NULL, 1,"operator",hold1.c_str());}void VParserXs::preprocCb(VFileLine* fl, const string& text) {    cbFileline(fl);    static string hold1; hold1 = text;    call(NULL, 1,"preproc",hold1.c_str());}void VParserXs::stringCb(VFileLine* fl, const string& text) {    cbFileline(fl);    static string hold1; hold1 = text;    call(NULL, 1,"string",hold1.c_str());}void VParserXs::symbolCb(VFileLine* fl, const string& text) {    cbFileline(fl);    static string hold1; hold1 = text;    call(NULL, 1,"symbol",hold1.c_str());}void VParserXs::sysfuncCb(VFileLine* fl, const string& text) {    cbFileline(fl);    static string hold1; hold1 = text;    call(NULL, 1,"sysfunc",hold1.c_str());}// Verilog::SigParser Callback methodsvoid VParserXs::endcellCb(VFileLine* fl, const string& kwd) {    cbFileline(fl);    static string hold1; hold1 = kwd;    call(NULL, 1,"endcell",hold1.c_str());}void VParserXs::endinterfaceCb(VFileLine* fl, const string& kwd) {    cbFileline(fl);    static string hold1; hold1 = kwd;    call(NULL, 1,"endinterface",hold1.c_str());}void VParserXs::endmoduleCb(VFileLine* fl, const string& kwd) {    cbFileline(fl);    static string hold1; hold1 = kwd;    call(NULL, 1,"endmodule",hold1.c_str());}void VParserXs::endpackageCb(VFileLine* fl, const string& kwd) {    cbFileline(fl);    static string hold1; hold1 = kwd;    call(NULL, 1,"endpackage",hold1.c_str());}void VParserXs::endtaskfuncCb(VFileLine* fl, const string& kwd) {    cbFileline(fl);    static string hold1; hold1 = kwd;    call(NULL, 1,"endtaskfunc",hold1.c_str());}void VParserXs::functionCb(VFileLine* fl, const string& kwd, const string& name, const string& type) {    cbFileline(fl);    static string hold1; hold1 = kwd;    static string hold2; hold2 = name;    static string hold3; hold3 = type;    call(NULL, 3,"function",hold1.c_str(), hold2.c_str(), hold3.c_str());}void VParserXs::importCb(VFileLine* fl, const string& name) {    cbFileline(fl);    static string hold1; hold1 = name;    call(NULL, 1,"import",hold1.c_str());}void VParserXs::instantCb(VFileLine* fl, const string& mod, const string& cell, const string& range) {    cbFileline(fl);    static string hold1; hold1 = mod;    static string hold2; hold2 = cell;    static string hold3; hold3 = range;    call(NULL, 3,"instant",hold1.c_str(), hold2.c_str(), hold3.c_str());}void VParserXs::interfaceCb(VFileLine* fl, const string& kwd, const string& name) {    cbFileline(fl);    static string hold1; hold1 = kwd;    static string hold2; hold2 = name;    call(NULL, 2,"interface",hold1.c_str(), hold2.c_str());}void VParserXs::moduleCb(VFileLine* fl, const string& kwd, const string& name, bool celldefine) {    cbFileline(fl);    static string hold1; hold1 = kwd;    static string hold2; hold2 = name;    //Unused    static string hold4; hold4 = celldefine?"1":"0";    call(NULL, 4,"module",hold1.c_str(), hold2.c_str(), NULL, hold4.c_str());}void VParserXs::packageCb(VFileLine* fl, const string& kwd, const string& name) {    cbFileline(fl);    static string hold1; hold1 = kwd;    static string hold2; hold2 = name;    //Unused    call(NULL, 2,"package",hold1.c_str(), hold2.c_str());}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -