verilator/test_regress/t/TestVpi.h
2023-01-01 10:18:39 -05:00

54 lines
1.6 KiB
C++

// -*- mode: C++; c-file-style: "cc-mode" -*-
//*************************************************************************
//
// Copyright 2013-2023 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 Version 3 or the Perl Artistic License
// Version 2.0.
// SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
//
//*************************************************************************
#include "vpi_user.h"
// Avoid C++11 in this file as not all simulators allow it
//======================================================================
class TestVpiHandle {
/// For testing, etc, wrap vpiHandle in an auto-releasing class
vpiHandle m_handle; // No = as no C++11
bool m_freeit; // No = as no C++11
public:
TestVpiHandle()
: m_handle(NULL)
, m_freeit(true) {}
TestVpiHandle(vpiHandle h)
: m_handle(h)
, m_freeit(true) {}
~TestVpiHandle() { release(); }
operator vpiHandle() const { return m_handle; }
TestVpiHandle& operator=(vpiHandle h) {
release();
m_handle = h;
return *this;
}
void release() {
if (m_handle && m_freeit) {
// Below not VL_DO_DANGLING so is portable
#ifdef IVERILOG
vpi_free_object(m_handle);
#else
vpi_release_handle(m_handle);
#endif
m_handle = NULL;
}
}
// Freed by another action e.g. vpi_scan; so empty and don't free again
void freed() {
m_handle = NULL;
m_freeit = false;
}
};