systemc: Fix style issues in the TLM header files.
Change-Id: Id12ffb9b56b3887afcf30120f81ce5eb75a5987b Reviewed-on: https://gem5-review.googlesource.com/c/15057 Reviewed-by: Anthony Gutierrez <anthony.gutierrez@amd.com> Maintainer: Anthony Gutierrez <anthony.gutierrez@amd.com>
This commit is contained in:
@@ -17,8 +17,8 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_HEADER__
|
||||
#define __TLM_HEADER__
|
||||
#ifndef __SYSTEMC_EXT_TLM__
|
||||
#define __SYSTEMC_EXT_TLM__
|
||||
|
||||
#include <systemc> // main SystemC header
|
||||
|
||||
@@ -30,4 +30,4 @@
|
||||
#include "tlm_core/tlm_2/tlm_sockets/tlm_sockets.h"
|
||||
#include "tlm_core/tlm_2/tlm_quantum/tlm_quantum.h"
|
||||
|
||||
#endif /* TLM_HEADER_INCLUDED_ */
|
||||
#endif /* __SYSTEMC_EXT_TLM__ */
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
## ****************************************************************************
|
||||
##
|
||||
## Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
|
||||
## more contributor license agreements. See the NOTICE file distributed
|
||||
## with this work for additional information regarding copyright ownership.
|
||||
## Accellera licenses this file to you under the Apache License, Version 2.0
|
||||
## (the "License"); you may not use this file except in compliance with the
|
||||
## License. You may obtain a copy of the License at
|
||||
##
|
||||
## http://www.apache.org/licenses/LICENSE-2.0
|
||||
##
|
||||
## Unless required by applicable law or agreed to in writing, software
|
||||
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
## implied. See the License for the specific language governing
|
||||
## permissions and limitations under the License.
|
||||
##
|
||||
## ****************************************************************************
|
||||
##
|
||||
## src/tlm_core/Makefile.am --
|
||||
## Process this file with automake to produce a Makefile.in file.
|
||||
##
|
||||
## Original Author: Philipp A. Hartmann, OFFIS, 2013-05-17
|
||||
##
|
||||
## ****************************************************************************
|
||||
##
|
||||
## MODIFICATION LOG - modifiers, enter your name, affiliation, date and
|
||||
## changes you are making here.
|
||||
##
|
||||
## Name, Affiliation, Date:
|
||||
## Description of Modification:
|
||||
##
|
||||
## ****************************************************************************
|
||||
|
||||
include $(top_srcdir)/config/Make-rules.sysc
|
||||
|
||||
H_FILES = \
|
||||
tlm_2/tlm_version.h \
|
||||
tlm_2/tlm_2_interfaces/tlm_2_interfaces.h \
|
||||
tlm_2/tlm_2_interfaces/tlm_dmi.h \
|
||||
tlm_2/tlm_2_interfaces/tlm_fw_bw_ifs.h \
|
||||
\
|
||||
tlm_2/tlm_generic_payload/tlm_array.h \
|
||||
tlm_2/tlm_generic_payload/tlm_endian_conv.h \
|
||||
tlm_2/tlm_generic_payload/tlm_generic_payload.h \
|
||||
tlm_2/tlm_generic_payload/tlm_gp.h \
|
||||
tlm_2/tlm_generic_payload/tlm_helpers.h \
|
||||
tlm_2/tlm_generic_payload/tlm_phase.h \
|
||||
\
|
||||
tlm_2/tlm_quantum/tlm_global_quantum.h \
|
||||
tlm_2/tlm_quantum/tlm_quantum.h \
|
||||
\
|
||||
tlm_2/tlm_sockets/tlm_base_socket_if.h \
|
||||
tlm_2/tlm_sockets/tlm_initiator_socket.h \
|
||||
tlm_2/tlm_sockets/tlm_sockets.h \
|
||||
tlm_2/tlm_sockets/tlm_target_socket.h \
|
||||
\
|
||||
tlm_1/tlm_analysis/tlm_analysis.h \
|
||||
tlm_1/tlm_analysis/tlm_analysis_fifo.h \
|
||||
tlm_1/tlm_analysis/tlm_analysis_if.h \
|
||||
tlm_1/tlm_analysis/tlm_analysis_port.h \
|
||||
tlm_1/tlm_analysis/tlm_analysis_triple.h \
|
||||
tlm_1/tlm_analysis/tlm_write_if.h \
|
||||
\
|
||||
tlm_1/tlm_req_rsp/tlm_req_rsp.h \
|
||||
tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_core_ifs.h \
|
||||
tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_fifo_ifs.h \
|
||||
tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_master_slave_ifs.h \
|
||||
tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_tag.h \
|
||||
\
|
||||
tlm_1/tlm_req_rsp/tlm_adapters/tlm_adapters.h \
|
||||
\
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo_peek.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo_put_get.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo_resize.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_req_rsp_channels/tlm_put_get_imp.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_req_rsp_channels/tlm_req_rsp_channels.h \
|
||||
\
|
||||
tlm_1/tlm_req_rsp/tlm_ports/tlm_event_finder.h \
|
||||
tlm_1/tlm_req_rsp/tlm_ports/tlm_nonblocking_port.h
|
||||
|
||||
CXX_FILES = \
|
||||
tlm_2/tlm_generic_payload/tlm_gp.cpp \
|
||||
tlm_2/tlm_generic_payload/tlm_phase.cpp \
|
||||
tlm_2/tlm_quantum/tlm_global_quantum.cpp
|
||||
|
||||
EXTRA_DIST += \
|
||||
tlm_1/README.txt \
|
||||
tlm_2/README.txt
|
||||
|
||||
localincludedir = $(includedir)/tlm_core
|
||||
nobase_localinclude_HEADERS = $(H_FILES)
|
||||
|
||||
noinst_LTLIBRARIES = libtlm_core.la
|
||||
libtlm_core_la_SOURCES = $(NO_H_FILES) $(CXX_FILES)
|
||||
@@ -1,799 +0,0 @@
|
||||
# Makefile.in generated by automake 1.14 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
# top-level SystemC include directory is added in Make-rules.{sysc,examples}
|
||||
|
||||
# build flags
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
target_triplet = @target@
|
||||
DIST_COMMON = $(top_srcdir)/config/Make-rules.sysc \
|
||||
$(top_srcdir)/config/Make-rules.common $(srcdir)/Makefile.in \
|
||||
$(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
|
||||
$(nobase_localinclude_HEADERS)
|
||||
@WANT_DEBUG_TRUE@am__append_1 = $(DEBUG_CXXFLAGS)
|
||||
@WANT_DEBUG_TRUE@am__append_2 = $(DEBUG_CXXFLAGS)
|
||||
@WANT_DEBUG_TRUE@am__append_3 = $(DEBUG_CXXFLAGS)
|
||||
@WANT_OPTIMIZE_TRUE@am__append_4 = $(OPT_CXXFLAGS)
|
||||
@WANT_OPTIMIZE_TRUE@am__append_5 = $(OPT_CXXFLAGS)
|
||||
|
||||
# either for async_update locking or pthread processes
|
||||
@USES_PTHREADS_LIB_TRUE@am__append_6 = $(PTHREAD_CFLAGS)
|
||||
@USES_PTHREADS_LIB_TRUE@am__append_7 = $(PTHREAD_CFLAGS)
|
||||
@USES_PTHREADS_LIB_TRUE@am__append_8 = $(PTHREAD_LIBS)
|
||||
@DISABLE_ASYNC_UPDATES_TRUE@am__append_9 = -DSC_DISABLE_ASYNC_UPDATES
|
||||
@ENABLE_CALLBACKS_TRUE@am__append_10 = -DSC_ENABLE_SIMULATION_PHASE_CALLBACKS
|
||||
@ENABLE_CALLBACKS_TRACING_TRUE@am__append_11 = -DSC_ENABLE_SIMULATION_PHASE_CALLBACKS_TRACING
|
||||
@WANT_PTHREADS_THREADS_TRUE@am__append_12 = -DSC_USE_PTHREADS
|
||||
@DISABLE_VCD_SCOPES_TRUE@am__append_13 = -DSC_DISABLE_VCD_SCOPES
|
||||
subdir = src/tlm_core
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/config/ax_check_define.m4 \
|
||||
$(top_srcdir)/config/ax_pthread.m4 \
|
||||
$(top_srcdir)/config/libtool.m4 \
|
||||
$(top_srcdir)/config/ltoptions.m4 \
|
||||
$(top_srcdir)/config/ltsugar.m4 \
|
||||
$(top_srcdir)/config/ltversion.m4 \
|
||||
$(top_srcdir)/config/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
||||
libtlm_core_la_LIBADD =
|
||||
am__dirstamp = $(am__leading_dot)dirstamp
|
||||
am__objects_1 = tlm_2/tlm_generic_payload/tlm_gp.lo \
|
||||
tlm_2/tlm_generic_payload/tlm_phase.lo \
|
||||
tlm_2/tlm_quantum/tlm_global_quantum.lo
|
||||
am_libtlm_core_la_OBJECTS = $(am__objects_1)
|
||||
libtlm_core_la_OBJECTS = $(am_libtlm_core_la_OBJECTS)
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
am__v_lt_1 =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@
|
||||
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
am__mv = mv -f
|
||||
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
|
||||
LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
|
||||
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||
$(AM_CXXFLAGS) $(CXXFLAGS)
|
||||
AM_V_CXX = $(am__v_CXX_@AM_V@)
|
||||
am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
|
||||
am__v_CXX_0 = @echo " CXX " $@;
|
||||
am__v_CXX_1 =
|
||||
CXXLD = $(CXX)
|
||||
CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
|
||||
$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
|
||||
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
|
||||
am__v_CXXLD_0 = @echo " CXXLD " $@;
|
||||
am__v_CXXLD_1 =
|
||||
SOURCES = $(libtlm_core_la_SOURCES)
|
||||
DIST_SOURCES = $(libtlm_core_la_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
*) f=$$p;; \
|
||||
esac;
|
||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||
am__install_max = 40
|
||||
am__nobase_strip_setup = \
|
||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||
am__nobase_strip = \
|
||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||
am__nobase_list = $(am__nobase_strip_setup); \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||
if (++n[$$2] == $(am__install_max)) \
|
||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||
END { for (dir in files) print dir, files[dir] }'
|
||||
am__base_list = \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||
am__uninstall_files_from_dir = { \
|
||||
test -z "$$files" \
|
||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(localincludedir)"
|
||||
HEADERS = $(nobase_localinclude_HEADERS)
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
am__uniquify_input = $(AWK) '\
|
||||
BEGIN { nonempty = 0; } \
|
||||
{ items[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in items) print i; }; } \
|
||||
'
|
||||
# Make sure the list of sources is unique. This is necessary because,
|
||||
# e.g., the same source file might be shared among _SOURCES variables
|
||||
# for different programs/libraries.
|
||||
am__define_uniq_tagged_files = \
|
||||
list='$(am__tagged_files)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCAS = @CCAS@
|
||||
CCASDEPMODE = @CCASDEPMODE@
|
||||
CCASFLAGS = @CCASFLAGS@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEBUG_CXXFLAGS = @DEBUG_CXXFLAGS@
|
||||
DEFS = $(PKGCONFIG_DEFINES) $(EXTRA_DEFINES)
|
||||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
DUMPBIN = @DUMPBIN@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXPLICIT_LPTHREAD = @EXPLICIT_LPTHREAD@
|
||||
EXTRA_ASFLAGS = @EXTRA_ASFLAGS@
|
||||
EXTRA_CFLAGS = @EXTRA_CFLAGS@
|
||||
EXTRA_CXXFLAGS = @EXTRA_CXXFLAGS@
|
||||
EXTRA_LDFLAGS = @EXTRA_LDFLAGS@
|
||||
FGREP = @FGREP@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LDFLAG_RPATH = @LDFLAG_RPATH@
|
||||
LIBCONFIG_DEFINES = @LIBCONFIG_DEFINES@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIB_ARCH_SUFFIX = @LIB_ARCH_SUFFIX@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OPT_CXXFLAGS = @OPT_CXXFLAGS@
|
||||
OTOOL = @OTOOL@
|
||||
OTOOL64 = @OTOOL64@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@
|
||||
PKGCONFIG_DEFINES = @PKGCONFIG_DEFINES@
|
||||
PKGCONFIG_LDPRIV = @PKGCONFIG_LDPRIV@
|
||||
PTHREAD_CC = @PTHREAD_CC@
|
||||
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
|
||||
PTHREAD_LIBS = @PTHREAD_LIBS@
|
||||
QT_ARCH = @QT_ARCH@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
TARGET_ARCH = @TARGET_ARCH@
|
||||
TLM_PACKAGE_VERSION = @TLM_PACKAGE_VERSION@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
ax_pthread_config = @ax_pthread_config@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
examplesdir = @examplesdir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libarchdir = @libarchdir@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
rootdocdir = @rootdocdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
target_os = @target_os@
|
||||
target_vendor = @target_vendor@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src
|
||||
AM_CFLAGS = $(EXTRA_CFLAGS) $(am__append_2) $(am__append_5) \
|
||||
$(am__append_7)
|
||||
AM_CXXFLAGS = $(EXTRA_CXXFLAGS) $(am__append_1) $(am__append_4) \
|
||||
$(am__append_6)
|
||||
AM_CCASFLAGS = $(EXTRA_ASFLAGS) $(am__append_3)
|
||||
AM_LDFLAGS = $(EXTRA_LDFLAGS) $(am__append_8)
|
||||
|
||||
# always add fix-point support
|
||||
EXTRA_DEFINES = -DSC_INCLUDE_FX -DSC_BUILD $(am__append_9) \
|
||||
$(am__append_10) $(am__append_11) $(am__append_12) \
|
||||
$(am__append_13)
|
||||
|
||||
# initialize some useful variables (filled later)
|
||||
CLEANFILES =
|
||||
EXTRA_DIST = tlm_1/README.txt tlm_2/README.txt
|
||||
H_FILES = \
|
||||
tlm_2/tlm_version.h \
|
||||
tlm_2/tlm_2_interfaces/tlm_2_interfaces.h \
|
||||
tlm_2/tlm_2_interfaces/tlm_dmi.h \
|
||||
tlm_2/tlm_2_interfaces/tlm_fw_bw_ifs.h \
|
||||
\
|
||||
tlm_2/tlm_generic_payload/tlm_array.h \
|
||||
tlm_2/tlm_generic_payload/tlm_endian_conv.h \
|
||||
tlm_2/tlm_generic_payload/tlm_generic_payload.h \
|
||||
tlm_2/tlm_generic_payload/tlm_gp.h \
|
||||
tlm_2/tlm_generic_payload/tlm_helpers.h \
|
||||
tlm_2/tlm_generic_payload/tlm_phase.h \
|
||||
\
|
||||
tlm_2/tlm_quantum/tlm_global_quantum.h \
|
||||
tlm_2/tlm_quantum/tlm_quantum.h \
|
||||
\
|
||||
tlm_2/tlm_sockets/tlm_base_socket_if.h \
|
||||
tlm_2/tlm_sockets/tlm_initiator_socket.h \
|
||||
tlm_2/tlm_sockets/tlm_sockets.h \
|
||||
tlm_2/tlm_sockets/tlm_target_socket.h \
|
||||
\
|
||||
tlm_1/tlm_analysis/tlm_analysis.h \
|
||||
tlm_1/tlm_analysis/tlm_analysis_fifo.h \
|
||||
tlm_1/tlm_analysis/tlm_analysis_if.h \
|
||||
tlm_1/tlm_analysis/tlm_analysis_port.h \
|
||||
tlm_1/tlm_analysis/tlm_analysis_triple.h \
|
||||
tlm_1/tlm_analysis/tlm_write_if.h \
|
||||
\
|
||||
tlm_1/tlm_req_rsp/tlm_req_rsp.h \
|
||||
tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_core_ifs.h \
|
||||
tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_fifo_ifs.h \
|
||||
tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_master_slave_ifs.h \
|
||||
tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_tag.h \
|
||||
\
|
||||
tlm_1/tlm_req_rsp/tlm_adapters/tlm_adapters.h \
|
||||
\
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo_peek.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo_put_get.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo_resize.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_req_rsp_channels/tlm_put_get_imp.h \
|
||||
tlm_1/tlm_req_rsp/tlm_channels/tlm_req_rsp_channels/tlm_req_rsp_channels.h \
|
||||
\
|
||||
tlm_1/tlm_req_rsp/tlm_ports/tlm_event_finder.h \
|
||||
tlm_1/tlm_req_rsp/tlm_ports/tlm_nonblocking_port.h
|
||||
|
||||
CXX_FILES = \
|
||||
tlm_2/tlm_generic_payload/tlm_gp.cpp \
|
||||
tlm_2/tlm_generic_payload/tlm_phase.cpp \
|
||||
tlm_2/tlm_quantum/tlm_global_quantum.cpp
|
||||
|
||||
localincludedir = $(includedir)/tlm_core
|
||||
nobase_localinclude_HEADERS = $(H_FILES)
|
||||
noinst_LTLIBRARIES = libtlm_core.la
|
||||
libtlm_core_la_SOURCES = $(NO_H_FILES) $(CXX_FILES)
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .cpp .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/config/Make-rules.sysc $(top_srcdir)/config/Make-rules.common $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/tlm_core/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --foreign src/tlm_core/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
$(top_srcdir)/config/Make-rules.sysc $(top_srcdir)/config/Make-rules.common:
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
clean-noinstLTLIBRARIES:
|
||||
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
|
||||
@list='$(noinst_LTLIBRARIES)'; \
|
||||
locs=`for p in $$list; do echo $$p; done | \
|
||||
sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
|
||||
sort -u`; \
|
||||
test -z "$$locs" || { \
|
||||
echo rm -f $${locs}; \
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
tlm_2/tlm_generic_payload/$(am__dirstamp):
|
||||
@$(MKDIR_P) tlm_2/tlm_generic_payload
|
||||
@: > tlm_2/tlm_generic_payload/$(am__dirstamp)
|
||||
tlm_2/tlm_generic_payload/$(DEPDIR)/$(am__dirstamp):
|
||||
@$(MKDIR_P) tlm_2/tlm_generic_payload/$(DEPDIR)
|
||||
@: > tlm_2/tlm_generic_payload/$(DEPDIR)/$(am__dirstamp)
|
||||
tlm_2/tlm_generic_payload/tlm_gp.lo: \
|
||||
tlm_2/tlm_generic_payload/$(am__dirstamp) \
|
||||
tlm_2/tlm_generic_payload/$(DEPDIR)/$(am__dirstamp)
|
||||
tlm_2/tlm_generic_payload/tlm_phase.lo: \
|
||||
tlm_2/tlm_generic_payload/$(am__dirstamp) \
|
||||
tlm_2/tlm_generic_payload/$(DEPDIR)/$(am__dirstamp)
|
||||
tlm_2/tlm_quantum/$(am__dirstamp):
|
||||
@$(MKDIR_P) tlm_2/tlm_quantum
|
||||
@: > tlm_2/tlm_quantum/$(am__dirstamp)
|
||||
tlm_2/tlm_quantum/$(DEPDIR)/$(am__dirstamp):
|
||||
@$(MKDIR_P) tlm_2/tlm_quantum/$(DEPDIR)
|
||||
@: > tlm_2/tlm_quantum/$(DEPDIR)/$(am__dirstamp)
|
||||
tlm_2/tlm_quantum/tlm_global_quantum.lo: \
|
||||
tlm_2/tlm_quantum/$(am__dirstamp) \
|
||||
tlm_2/tlm_quantum/$(DEPDIR)/$(am__dirstamp)
|
||||
|
||||
libtlm_core.la: $(libtlm_core_la_OBJECTS) $(libtlm_core_la_DEPENDENCIES) $(EXTRA_libtlm_core_la_DEPENDENCIES)
|
||||
$(AM_V_CXXLD)$(CXXLINK) $(libtlm_core_la_OBJECTS) $(libtlm_core_la_LIBADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
-rm -f tlm_2/tlm_generic_payload/*.$(OBJEXT)
|
||||
-rm -f tlm_2/tlm_generic_payload/*.lo
|
||||
-rm -f tlm_2/tlm_quantum/*.$(OBJEXT)
|
||||
-rm -f tlm_2/tlm_quantum/*.lo
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@tlm_2/tlm_generic_payload/$(DEPDIR)/tlm_gp.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@tlm_2/tlm_generic_payload/$(DEPDIR)/tlm_phase.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@tlm_2/tlm_quantum/$(DEPDIR)/tlm_global_quantum.Plo@am__quote@
|
||||
|
||||
.cpp.o:
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
||||
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
|
||||
@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
|
||||
|
||||
.cpp.obj:
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
|
||||
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
|
||||
@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
|
||||
.cpp.lo:
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
|
||||
@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
|
||||
@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
-rm -rf tlm_2/tlm_generic_payload/.libs tlm_2/tlm_generic_payload/_libs
|
||||
-rm -rf tlm_2/tlm_quantum/.libs tlm_2/tlm_quantum/_libs
|
||||
install-nobase_localincludeHEADERS: $(nobase_localinclude_HEADERS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(nobase_localinclude_HEADERS)'; test -n "$(localincludedir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(localincludedir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(localincludedir)" || exit 1; \
|
||||
fi; \
|
||||
$(am__nobase_list) | while read dir files; do \
|
||||
xfiles=; for file in $$files; do \
|
||||
if test -f "$$file"; then xfiles="$$xfiles $$file"; \
|
||||
else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \
|
||||
test -z "$$xfiles" || { \
|
||||
test "x$$dir" = x. || { \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(localincludedir)/$$dir'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(localincludedir)/$$dir"; }; \
|
||||
echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(localincludedir)/$$dir'"; \
|
||||
$(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(localincludedir)/$$dir" || exit $$?; }; \
|
||||
done
|
||||
|
||||
uninstall-nobase_localincludeHEADERS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(nobase_localinclude_HEADERS)'; test -n "$(localincludedir)" || list=; \
|
||||
$(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \
|
||||
dir='$(DESTDIR)$(localincludedir)'; $(am__uninstall_files_from_dir)
|
||||
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-am
|
||||
TAGS: tags
|
||||
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
if test $$# -gt 0; then \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
"$$@" $$unique; \
|
||||
else \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: ctags-am
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscopelist: cscopelist-am
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
case "$(srcdir)" in \
|
||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||
esac; \
|
||||
for i in $$list; do \
|
||||
if test -f "$$i"; then \
|
||||
echo "$(subdir)/$$i"; \
|
||||
else \
|
||||
echo "$$sdir/$$i"; \
|
||||
fi; \
|
||||
done >> $(top_builddir)/cscope.files
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(LTLIBRARIES) $(HEADERS)
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(localincludedir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
-rm -f tlm_2/tlm_generic_payload/$(DEPDIR)/$(am__dirstamp)
|
||||
-rm -f tlm_2/tlm_generic_payload/$(am__dirstamp)
|
||||
-rm -f tlm_2/tlm_quantum/$(DEPDIR)/$(am__dirstamp)
|
||||
-rm -f tlm_2/tlm_quantum/$(am__dirstamp)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -rf tlm_2/tlm_generic_payload/$(DEPDIR) tlm_2/tlm_quantum/$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-tags
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-nobase_localincludeHEADERS
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -rf tlm_2/tlm_generic_payload/$(DEPDIR) tlm_2/tlm_quantum/$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||
mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-nobase_localincludeHEADERS
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
|
||||
clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
|
||||
ctags-am distclean distclean-compile distclean-generic \
|
||||
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
||||
html-am info info-am install install-am install-data \
|
||||
install-data-am install-dvi install-dvi-am install-exec \
|
||||
install-exec-am install-html install-html-am install-info \
|
||||
install-info-am install-man install-nobase_localincludeHEADERS \
|
||||
install-pdf install-pdf-am install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
||||
mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
|
||||
pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
|
||||
uninstall-nobase_localincludeHEADERS
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
@@ -17,17 +17,13 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_ANALYSIS_H__
|
||||
#define __TLM_ANALYSIS_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_H__
|
||||
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_write_if.h"
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_analysis_if.h"
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_analysis_triple.h"
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_analysis_port.h"
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_analysis_fifo.h"
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_analysis_if.h"
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_analysis_port.h"
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_analysis_triple.h"
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_write_if.h"
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_H__ */
|
||||
|
||||
@@ -17,38 +17,30 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_ANALYSIS_FIFO_H__
|
||||
#define __TLM_ANALYSIS_FIFO_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_FIFO_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_FIFO_H__
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo.h"
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_analysis_if.h"
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_analysis_triple.h"
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo.h"
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
template< typename T >
|
||||
class tlm_analysis_fifo :
|
||||
public tlm_fifo< T > ,
|
||||
public virtual tlm_analysis_if< T > ,
|
||||
public virtual tlm_analysis_if< tlm_analysis_triple< T > > {
|
||||
|
||||
public:
|
||||
|
||||
// analysis fifo is an unbounded tlm_fifo
|
||||
|
||||
tlm_analysis_fifo( const char *nm ) : tlm_fifo<T>( nm , -16 ) {}
|
||||
tlm_analysis_fifo() : tlm_fifo<T>( -16 ) {}
|
||||
|
||||
void write( const tlm_analysis_triple<T> &t ) {
|
||||
nb_put( t );
|
||||
}
|
||||
|
||||
void write( const T &t ) {
|
||||
nb_put( t );
|
||||
}
|
||||
template <typename T>
|
||||
class tlm_analysis_fifo : public tlm_fifo<T>,
|
||||
public virtual tlm_analysis_if<T>,
|
||||
public virtual tlm_analysis_if<tlm_analysis_triple<T>>
|
||||
{
|
||||
public:
|
||||
// analysis fifo is an unbounded tlm_fifo
|
||||
tlm_analysis_fifo(const char *nm) : tlm_fifo<T>(nm, -16) {}
|
||||
tlm_analysis_fifo() : tlm_fifo<T>(-16) {}
|
||||
|
||||
void write(const tlm_analysis_triple<T> &t) { nb_put(t); }
|
||||
void write(const T &t) { nb_put(t); }
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_FIFO_H__ */
|
||||
|
||||
@@ -17,23 +17,22 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_ANALYSIS_IF_H__
|
||||
#define __TLM_ANALYSIS_IF_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_IF_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_IF_H__
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_write_if.h"
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_analysis_if : public virtual tlm_write_if<T>
|
||||
{
|
||||
};
|
||||
{};
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_delayed_analysis_if : public virtual tlm_delayed_write_if<T>
|
||||
{
|
||||
};
|
||||
{};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_IF_H__ */
|
||||
|
||||
@@ -17,68 +17,62 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_ANALYSIS_PORT_H__
|
||||
#define __TLM_ANALYSIS_PORT_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_PORT_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_PORT_H__
|
||||
|
||||
#include <algorithm>
|
||||
#include <deque>
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_analysis/tlm_analysis_if.h"
|
||||
#include <deque>
|
||||
#include <algorithm>
|
||||
|
||||
namespace tlm {
|
||||
|
||||
|
||||
template < typename T>
|
||||
class tlm_analysis_port :
|
||||
public sc_core::sc_object ,
|
||||
public virtual tlm_analysis_if< T >
|
||||
namespace tlm
|
||||
{
|
||||
public:
|
||||
tlm_analysis_port() : sc_core::sc_object() {}
|
||||
tlm_analysis_port( const char *nm ) : sc_core::sc_object( nm ) {}
|
||||
|
||||
// bind and () work for both interfaces and analysis ports, since
|
||||
// analysis ports implement the analysis interface
|
||||
template <typename T>
|
||||
class tlm_analysis_port : public sc_core::sc_object,
|
||||
public virtual tlm_analysis_if<T>
|
||||
{
|
||||
public:
|
||||
tlm_analysis_port() : sc_core::sc_object() {}
|
||||
tlm_analysis_port(const char *nm) : sc_core::sc_object(nm) {}
|
||||
|
||||
virtual void bind( tlm_analysis_if<T> &_if ) {
|
||||
m_interfaces.push_back( &_if );
|
||||
}
|
||||
// bind and () work for both interfaces and analysis ports, since
|
||||
// analysis ports implement the analysis interface.
|
||||
|
||||
void operator() ( tlm_analysis_if<T> &_if ) { bind( _if ); }
|
||||
|
||||
virtual bool unbind( tlm_analysis_if<T> &_if ) {
|
||||
|
||||
typename std::deque< tlm_analysis_if<T> * >::iterator i
|
||||
= std::remove( m_interfaces.begin(), m_interfaces.end(), &_if );
|
||||
|
||||
if( i != m_interfaces.end() ) {
|
||||
m_interfaces.erase(i, m_interfaces.end() );
|
||||
return 1;
|
||||
virtual void
|
||||
bind(tlm_analysis_if<T> &_if)
|
||||
{
|
||||
m_interfaces.push_back(&_if);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
void write( const T &t ) {
|
||||
typename std::deque< tlm_analysis_if<T> * >::iterator i;
|
||||
|
||||
for( i = m_interfaces.begin();
|
||||
i != m_interfaces.end();
|
||||
i++ ) {
|
||||
|
||||
(*i)->write( t );
|
||||
void operator() (tlm_analysis_if<T> &_if) { bind(_if); }
|
||||
virtual bool
|
||||
unbind(tlm_analysis_if<T> &_if)
|
||||
{
|
||||
typename std::deque<tlm_analysis_if<T> *>::iterator i =
|
||||
std::remove(m_interfaces.begin(), m_interfaces.end(), &_if);
|
||||
|
||||
if (i != m_interfaces.end()) {
|
||||
m_interfaces.erase(i, m_interfaces.end());
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
void
|
||||
write(const T &t)
|
||||
{
|
||||
typename std::deque<tlm_analysis_if<T> *>::iterator i;
|
||||
|
||||
private:
|
||||
std::deque< tlm_analysis_if<T> * > m_interfaces;
|
||||
for (i = m_interfaces.begin(); i != m_interfaces.end(); i++) {
|
||||
(*i)->write(t);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
std::deque<tlm_analysis_if<T> *> m_interfaces;
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_PORT_H__ */
|
||||
|
||||
@@ -17,37 +17,37 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_ANALYSIS_TRIPLE_H__
|
||||
#define __TLM_ANALYSIS_TRIPLE_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_TRIPLE_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_TRIPLE_H__
|
||||
|
||||
//#include <systemc>
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
namespace tlm {
|
||||
template <typename T>
|
||||
struct tlm_analysis_triple
|
||||
{
|
||||
sc_core::sc_time start_time;
|
||||
T transaction;
|
||||
sc_core::sc_time end_time;
|
||||
|
||||
template< typename T>
|
||||
struct tlm_analysis_triple {
|
||||
tlm_analysis_triple() {}
|
||||
|
||||
sc_core::sc_time start_time;
|
||||
T transaction;
|
||||
sc_core::sc_time end_time;
|
||||
tlm_analysis_triple(const tlm_analysis_triple &triple)
|
||||
{
|
||||
start_time = triple.start_time;
|
||||
transaction = triple.transaction;
|
||||
end_time = triple.end_time;
|
||||
}
|
||||
|
||||
tlm_analysis_triple() {}
|
||||
|
||||
tlm_analysis_triple( const tlm_analysis_triple &triple ) {
|
||||
start_time = triple.start_time;
|
||||
transaction = triple.transaction;
|
||||
end_time = triple.end_time;
|
||||
}
|
||||
|
||||
tlm_analysis_triple( const T &t ) {
|
||||
transaction = t;
|
||||
}
|
||||
|
||||
operator T() { return transaction; }
|
||||
operator const T &() const { return transaction; }
|
||||
tlm_analysis_triple(const T &t)
|
||||
{
|
||||
transaction = t;
|
||||
}
|
||||
|
||||
operator T() { return transaction; }
|
||||
operator const T &() const { return transaction; }
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_ANALYSIS_TRIPLE_H__ */
|
||||
|
||||
@@ -17,26 +17,28 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_WRITE_IF_H__
|
||||
#define __TLM_WRITE_IF_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_WRITE_IF_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_WRITE_IF_H__
|
||||
|
||||
#include <systemc>
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
template <typename T>
|
||||
class tlm_write_if : public virtual sc_core::sc_interface {
|
||||
public:
|
||||
virtual void write(const T& t) = 0;
|
||||
class tlm_write_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual void write(const T &t) = 0;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class tlm_delayed_write_if : public virtual sc_core::sc_interface {
|
||||
public:
|
||||
virtual void write(const T& t, const sc_core::sc_time& time) = 0;
|
||||
class tlm_delayed_write_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual void write(const T &t, const sc_core::sc_time &time) = 0;
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
|
||||
#endif
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_ANALYSIS_TLM_WRITE_IF_H__ */
|
||||
|
||||
@@ -17,133 +17,122 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
//
|
||||
// Note to the LRM writer : This is the core of the TLM standard
|
||||
//
|
||||
|
||||
|
||||
#ifndef __TLM_CORE_IFS_H__
|
||||
#define __TLM_CORE_IFS_H__
|
||||
|
||||
//#include <systemc>
|
||||
#ifndef \
|
||||
__SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM1_INTERFACES_TLM_CORE_IFS_H__
|
||||
#define \
|
||||
__SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM1_INTERFACES_TLM_CORE_IFS_H__
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_tag.h"
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
// bidirectional blocking interfaces
|
||||
|
||||
template < typename REQ , typename RSP >
|
||||
// Bidirectional blocking interfaces.
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_transport_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual RSP transport( const REQ & ) = 0;
|
||||
|
||||
virtual void transport( const REQ &req , RSP &rsp ) {
|
||||
rsp = transport( req );
|
||||
}
|
||||
public:
|
||||
virtual RSP transport(const REQ &) = 0;
|
||||
|
||||
virtual void
|
||||
transport(const REQ &req, RSP &rsp)
|
||||
{
|
||||
rsp = transport(req);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// uni-directional blocking interfaces
|
||||
|
||||
template < typename T >
|
||||
// Uni-directional blocking interfaces.
|
||||
template <typename T>
|
||||
class tlm_blocking_get_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual T get( tlm_tag<T> *t = 0 ) = 0;
|
||||
virtual void get( T &t ) { t = get(); }
|
||||
|
||||
public:
|
||||
virtual T get(tlm_tag<T> *t=nullptr) = 0;
|
||||
virtual void get(T &t) { t = get(); }
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_blocking_put_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual void put( const T &t ) = 0;
|
||||
public:
|
||||
virtual void put(const T &t) = 0;
|
||||
};
|
||||
|
||||
// uni-directional non blocking interfaces
|
||||
// Uni-directional non blocking interfaces.
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_nonblocking_get_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual bool nb_get( T &t ) = 0;
|
||||
virtual bool nb_can_get( tlm_tag<T> *t = 0 ) const = 0;
|
||||
virtual const sc_core::sc_event &ok_to_get( tlm_tag<T> *t = 0 ) const = 0;
|
||||
public:
|
||||
virtual bool nb_get(T &t) = 0;
|
||||
virtual bool nb_can_get(tlm_tag<T> *t=nullptr) const = 0;
|
||||
virtual const sc_core::sc_event &
|
||||
ok_to_get(tlm_tag<T> *t=nullptr) const = 0;
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_nonblocking_put_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual bool nb_put( const T &t ) = 0;
|
||||
virtual bool nb_can_put( tlm_tag<T> *t = 0 ) const = 0;
|
||||
virtual const sc_core::sc_event &ok_to_put( tlm_tag<T> *t = 0 ) const = 0;
|
||||
public:
|
||||
virtual bool nb_put(const T &t) = 0;
|
||||
virtual bool nb_can_put(tlm_tag<T> *t=nullptr) const = 0;
|
||||
virtual const sc_core::sc_event &
|
||||
ok_to_put(tlm_tag<T> *t=nullptr) const = 0;
|
||||
};
|
||||
|
||||
// Combined uni-directional blocking and non blocking.
|
||||
template <typename T>
|
||||
class tlm_get_if : public virtual tlm_blocking_get_if<T>,
|
||||
public virtual tlm_nonblocking_get_if<T>
|
||||
{};
|
||||
|
||||
// combined uni-directional blocking and non blocking
|
||||
template <typename T>
|
||||
class tlm_put_if : public virtual tlm_blocking_put_if<T>,
|
||||
public virtual tlm_nonblocking_put_if<T>
|
||||
{};
|
||||
|
||||
template < typename T >
|
||||
class tlm_get_if :
|
||||
public virtual tlm_blocking_get_if< T > ,
|
||||
public virtual tlm_nonblocking_get_if< T > {};
|
||||
|
||||
template < typename T >
|
||||
class tlm_put_if :
|
||||
public virtual tlm_blocking_put_if< T > ,
|
||||
public virtual tlm_nonblocking_put_if< T > {};
|
||||
|
||||
|
||||
// peek interfaces
|
||||
|
||||
template < typename T >
|
||||
// Peek interfaces.
|
||||
template <typename T>
|
||||
class tlm_blocking_peek_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual T peek( tlm_tag<T> *t = 0 ) const = 0;
|
||||
virtual void peek( T &t ) const { t = peek(); }
|
||||
|
||||
public:
|
||||
virtual T peek(tlm_tag<T> *t=nullptr) const = 0;
|
||||
virtual void peek(T &t) const { t = peek(); }
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_nonblocking_peek_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual bool nb_peek( T &t ) const = 0;
|
||||
virtual bool nb_can_peek( tlm_tag<T> *t = 0 ) const = 0;
|
||||
virtual const sc_core::sc_event &ok_to_peek( tlm_tag<T> *t = 0 ) const = 0;
|
||||
public:
|
||||
virtual bool nb_peek(T &t) const = 0;
|
||||
virtual bool nb_can_peek(tlm_tag<T> *t=nullptr) const = 0;
|
||||
virtual const sc_core::sc_event &
|
||||
ok_to_peek(tlm_tag<T> *t=nullptr) const = 0;
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_peek_if :
|
||||
public virtual tlm_blocking_peek_if< T > ,
|
||||
public virtual tlm_nonblocking_peek_if< T > {};
|
||||
public virtual tlm_blocking_peek_if<T>,
|
||||
public virtual tlm_nonblocking_peek_if<T>
|
||||
{};
|
||||
|
||||
// get_peek interfaces
|
||||
// Get_peek interfaces.
|
||||
template <typename T>
|
||||
class tlm_blocking_get_peek_if : public virtual tlm_blocking_get_if<T>,
|
||||
public virtual tlm_blocking_peek_if<T>
|
||||
{};
|
||||
|
||||
template < typename T >
|
||||
class tlm_blocking_get_peek_if :
|
||||
public virtual tlm_blocking_get_if<T> ,
|
||||
public virtual tlm_blocking_peek_if<T> {};
|
||||
template <typename T>
|
||||
class tlm_nonblocking_get_peek_if : public virtual tlm_nonblocking_get_if<T>,
|
||||
public virtual tlm_nonblocking_peek_if<T>
|
||||
{};
|
||||
|
||||
template < typename T >
|
||||
class tlm_nonblocking_get_peek_if :
|
||||
public virtual tlm_nonblocking_get_if<T> ,
|
||||
public virtual tlm_nonblocking_peek_if<T> {};
|
||||
|
||||
|
||||
template < typename T >
|
||||
class tlm_get_peek_if :
|
||||
public virtual tlm_get_if<T> ,
|
||||
public virtual tlm_peek_if<T> ,
|
||||
public virtual tlm_blocking_get_peek_if<T> ,
|
||||
public virtual tlm_nonblocking_get_peek_if<T>
|
||||
{};
|
||||
template <typename T>
|
||||
class tlm_get_peek_if : public virtual tlm_get_if<T>,
|
||||
public virtual tlm_peek_if<T>, public virtual tlm_blocking_get_peek_if<T>,
|
||||
public virtual tlm_nonblocking_get_peek_if<T>
|
||||
{};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
/* __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM1_INTERFACES_TLM_CORE_IFS_H__ */
|
||||
|
||||
@@ -17,17 +17,15 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
//
|
||||
// Note to the LRM writer : These interfaces are channel specific interfaces
|
||||
// useful in the context of tlm_fifo.
|
||||
//
|
||||
|
||||
#ifndef __TLM_FIFO_IFS_H__
|
||||
#define __TLM_FIFO_IFS_H__
|
||||
#ifndef \
|
||||
__SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_1_INTERFACES_TLM_FIFO_IFS_H__
|
||||
#define \
|
||||
__SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_1_INTERFACES_TLM_FIFO_IFS_H__
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_core_ifs.h"
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
//
|
||||
// Fifo specific interfaces
|
||||
@@ -35,51 +33,50 @@ namespace tlm {
|
||||
|
||||
// Fifo Debug Interface
|
||||
|
||||
template< typename T >
|
||||
template <typename T>
|
||||
class tlm_fifo_debug_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual int used() const = 0;
|
||||
virtual int size() const = 0;
|
||||
virtual void debug() const = 0;
|
||||
public:
|
||||
virtual int used() const = 0;
|
||||
virtual int size() const = 0;
|
||||
virtual void debug() const = 0;
|
||||
|
||||
//
|
||||
// non blocking peek and poke - no notification
|
||||
//
|
||||
// n is index of data :
|
||||
// 0 <= n < size(), where 0 is most recently written, and size() - 1
|
||||
// is oldest ie the one about to be read.
|
||||
//
|
||||
|
||||
virtual bool nb_peek( T & , int n ) const = 0;
|
||||
virtual bool nb_poke( const T & , int n = 0 ) = 0;
|
||||
//
|
||||
// non blocking peek and poke - no notification
|
||||
//
|
||||
// n is index of data :
|
||||
// 0 <= n < size(), where 0 is most recently written, and size() - 1
|
||||
// is oldest ie the one about to be read.
|
||||
//
|
||||
|
||||
virtual bool nb_peek(T &, int n) const = 0;
|
||||
virtual bool nb_poke(const T&, int n=0) = 0;
|
||||
};
|
||||
|
||||
// fifo interfaces = extended + debug
|
||||
|
||||
template < typename T >
|
||||
class tlm_fifo_put_if :
|
||||
public virtual tlm_put_if<T> ,
|
||||
public virtual tlm_fifo_debug_if<T> {};
|
||||
template <typename T>
|
||||
class tlm_fifo_put_if : public virtual tlm_put_if<T>,
|
||||
public virtual tlm_fifo_debug_if<T>
|
||||
{};
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_fifo_get_if :
|
||||
public virtual tlm_get_peek_if<T> ,
|
||||
public virtual tlm_fifo_debug_if<T> {};
|
||||
public virtual tlm_get_peek_if<T>,
|
||||
public virtual tlm_fifo_debug_if<T>
|
||||
{};
|
||||
|
||||
class tlm_fifo_config_size_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual void nb_expand( unsigned int n = 1 ) = 0;
|
||||
virtual void nb_unbound( unsigned int n = 16 ) = 0;
|
||||
|
||||
virtual bool nb_reduce( unsigned int n = 1 ) = 0;
|
||||
virtual bool nb_bound( unsigned int n ) = 0;
|
||||
public:
|
||||
virtual void nb_expand(unsigned int n=1) = 0;
|
||||
virtual void nb_unbound(unsigned int n=16) = 0;
|
||||
|
||||
virtual bool nb_reduce(unsigned int n=1) = 0;
|
||||
virtual bool nb_bound(unsigned int n) = 0;
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
|
||||
/* __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_1_INTERFACES_TLM_FIFO_IFS_H__*/
|
||||
|
||||
@@ -17,57 +17,62 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_MASTER_SLAVE_IFS_H__
|
||||
#define __TLM_MASTER_SLAVE_IFS_H__
|
||||
#ifndef \
|
||||
__TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_1_INTERFACES_TLM_MASTER_SLAVE_IFS_H__
|
||||
#define \
|
||||
__TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_1_INTERFACES_TLM_MASTER_SLAVE_IFS_H__
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_core_ifs.h"
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
//
|
||||
// req/rsp combined interfaces
|
||||
//
|
||||
|
||||
// blocking
|
||||
|
||||
template < typename REQ , typename RSP>
|
||||
// Blocking.
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_blocking_master_if :
|
||||
public virtual tlm_blocking_put_if< REQ > ,
|
||||
public virtual tlm_blocking_get_peek_if< RSP > {};
|
||||
public virtual tlm_blocking_put_if<REQ>,
|
||||
public virtual tlm_blocking_get_peek_if<RSP>
|
||||
{};
|
||||
|
||||
template < typename REQ , typename RSP>
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_blocking_slave_if :
|
||||
public virtual tlm_blocking_put_if< RSP > ,
|
||||
public virtual tlm_blocking_get_peek_if< REQ > {};
|
||||
public virtual tlm_blocking_put_if<RSP>,
|
||||
public virtual tlm_blocking_get_peek_if<REQ>
|
||||
{};
|
||||
|
||||
// nonblocking
|
||||
|
||||
template < typename REQ , typename RSP >
|
||||
// Nonblocking.
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_nonblocking_master_if :
|
||||
public virtual tlm_nonblocking_put_if< REQ > ,
|
||||
public virtual tlm_nonblocking_get_peek_if< RSP > {};
|
||||
public virtual tlm_nonblocking_put_if<REQ>,
|
||||
public virtual tlm_nonblocking_get_peek_if<RSP>
|
||||
{};
|
||||
|
||||
template < typename REQ , typename RSP >
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_nonblocking_slave_if :
|
||||
public virtual tlm_nonblocking_put_if< RSP > ,
|
||||
public virtual tlm_nonblocking_get_peek_if< REQ > {};
|
||||
public virtual tlm_nonblocking_put_if<RSP>,
|
||||
public virtual tlm_nonblocking_get_peek_if<REQ>
|
||||
{};
|
||||
|
||||
// combined
|
||||
// Combined.
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_master_if : public virtual tlm_put_if<REQ>,
|
||||
public virtual tlm_get_peek_if<RSP> ,
|
||||
public virtual tlm_blocking_master_if<REQ, RSP>,
|
||||
public virtual tlm_nonblocking_master_if<REQ, RSP>
|
||||
{};
|
||||
|
||||
template < typename REQ , typename RSP >
|
||||
class tlm_master_if :
|
||||
public virtual tlm_put_if< REQ > ,
|
||||
public virtual tlm_get_peek_if< RSP > ,
|
||||
public virtual tlm_blocking_master_if< REQ , RSP > ,
|
||||
public virtual tlm_nonblocking_master_if< REQ , RSP > {};
|
||||
|
||||
template < typename REQ , typename RSP >
|
||||
class tlm_slave_if :
|
||||
public virtual tlm_put_if< RSP > ,
|
||||
public virtual tlm_get_peek_if< REQ > ,
|
||||
public virtual tlm_blocking_slave_if< REQ , RSP > ,
|
||||
public virtual tlm_nonblocking_slave_if< REQ , RSP > {};
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_slave_if : public virtual tlm_put_if<RSP>,
|
||||
public virtual tlm_get_peek_if<REQ>,
|
||||
public virtual tlm_blocking_slave_if<REQ, RSP>,
|
||||
public virtual tlm_nonblocking_slave_if<REQ, RSP>
|
||||
{};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
/* __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_1_INTERFACES_TLM_MASTER_SLAVE_IFS_H__ */
|
||||
|
||||
@@ -17,15 +17,17 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
//
|
||||
// Note to the LRM writer : This is part of the core TLM standard
|
||||
//
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_1_INTERFACES_TLM_TAG_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_1_INTERFACES_TLM_TAG_H__
|
||||
|
||||
#ifndef __TLM_TAG_H__
|
||||
#define __TLM_TAG_H__
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
template <class T>
|
||||
class tlm_tag
|
||||
{};
|
||||
|
||||
namespace tlm {
|
||||
template<class T> class tlm_tag {};
|
||||
}
|
||||
|
||||
#endif
|
||||
/* __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_1_INTERFACES_TLM_TAG_H__ */
|
||||
|
||||
@@ -17,89 +17,84 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_ADAPTERS_H__
|
||||
#define __TLM_ADAPTERS_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_ADAPTERS_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_ADAPTERS_H__
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_master_slave_ifs.h"
|
||||
|
||||
namespace tlm {
|
||||
|
||||
template< typename REQ , typename RSP >
|
||||
class tlm_transport_to_master :
|
||||
public sc_core::sc_module ,
|
||||
public virtual tlm_transport_if< REQ , RSP >
|
||||
namespace tlm
|
||||
{
|
||||
public:
|
||||
sc_core::sc_export< tlm_transport_if< REQ , RSP > > target_export;
|
||||
sc_core::sc_port< tlm_master_if< REQ , RSP > > master_port;
|
||||
|
||||
tlm_transport_to_master( sc_core::sc_module_name nm ) :
|
||||
sc_core::sc_module( nm ) {
|
||||
|
||||
target_export( *this );
|
||||
|
||||
}
|
||||
|
||||
tlm_transport_to_master() :
|
||||
sc_core::sc_module( sc_core::sc_module_name( sc_core::sc_gen_unique_name( "transport_to_master" ) ) ){
|
||||
|
||||
target_export( *this );
|
||||
|
||||
}
|
||||
|
||||
RSP transport( const REQ &req ) {
|
||||
|
||||
mutex.lock();
|
||||
|
||||
master_port->put( req );
|
||||
rsp = master_port->get();
|
||||
|
||||
mutex.unlock();
|
||||
return rsp;
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
sc_core::sc_mutex mutex;
|
||||
RSP rsp;
|
||||
|
||||
};
|
||||
|
||||
template< typename REQ , typename RSP >
|
||||
class tlm_slave_to_transport : public sc_core::sc_module
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_transport_to_master : public sc_core::sc_module,
|
||||
public virtual tlm_transport_if<REQ, RSP>
|
||||
{
|
||||
public:
|
||||
|
||||
SC_HAS_PROCESS( tlm_slave_to_transport );
|
||||
|
||||
sc_core::sc_port< tlm_slave_if< REQ , RSP > > slave_port;
|
||||
sc_core::sc_port< tlm_transport_if< REQ , RSP > > initiator_port;
|
||||
|
||||
tlm_slave_to_transport( sc_core::sc_module_name nm ) : sc_core::sc_module( nm )
|
||||
{}
|
||||
|
||||
tlm_slave_to_transport() :
|
||||
sc_core::sc_module( sc_core::sc_module_name( sc_core::sc_gen_unique_name("slave_to_transport") ) )
|
||||
{}
|
||||
|
||||
private:
|
||||
void run() {
|
||||
|
||||
REQ req;
|
||||
RSP rsp;
|
||||
|
||||
while( true ) {
|
||||
|
||||
slave_port->get( req );
|
||||
rsp = initiator_port->transport( req );
|
||||
slave_port->put( rsp );
|
||||
public:
|
||||
sc_core::sc_export<tlm_transport_if<REQ, RSP>> target_export;
|
||||
sc_core::sc_port<tlm_master_if<REQ, RSP>> master_port;
|
||||
|
||||
tlm_transport_to_master(sc_core::sc_module_name nm) :
|
||||
sc_core::sc_module(nm)
|
||||
{
|
||||
target_export( *this );
|
||||
}
|
||||
|
||||
}
|
||||
tlm_transport_to_master() :
|
||||
sc_core::sc_module(sc_core::sc_module_name(
|
||||
sc_core::sc_gen_unique_name("transport_to_master")))
|
||||
{
|
||||
target_export( *this );
|
||||
}
|
||||
|
||||
RSP
|
||||
transport(const REQ &req)
|
||||
{
|
||||
mutex.lock();
|
||||
master_port->put(req);
|
||||
rsp = master_port->get();
|
||||
|
||||
mutex.unlock();
|
||||
return rsp;
|
||||
}
|
||||
|
||||
private:
|
||||
sc_core::sc_mutex mutex;
|
||||
RSP rsp;
|
||||
};
|
||||
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_slave_to_transport : public sc_core::sc_module
|
||||
{
|
||||
public:
|
||||
SC_HAS_PROCESS(tlm_slave_to_transport);
|
||||
|
||||
sc_core::sc_port<tlm_slave_if<REQ, RSP>> slave_port;
|
||||
sc_core::sc_port<tlm_transport_if<REQ, RSP>> initiator_port;
|
||||
|
||||
tlm_slave_to_transport(sc_core::sc_module_name nm) :
|
||||
sc_core::sc_module(nm)
|
||||
{}
|
||||
|
||||
tlm_slave_to_transport() :
|
||||
sc_core::sc_module(sc_core::sc_module_name(
|
||||
sc_core::sc_gen_unique_name("slave_to_transport")))
|
||||
{}
|
||||
|
||||
private:
|
||||
void
|
||||
run()
|
||||
{
|
||||
REQ req;
|
||||
RSP rsp;
|
||||
|
||||
while (true) {
|
||||
slave_port->get(req);
|
||||
rsp = initiator_port->transport(req);
|
||||
slave_port->put(rsp);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_ADAPTERS_H__*/
|
||||
|
||||
@@ -17,252 +17,239 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
//
|
||||
// To the LRM writer : this class is purely an artifact of the implementation.
|
||||
//
|
||||
|
||||
#ifndef __CIRCULAR_BUFFER_H__
|
||||
#define __CIRCULAR_BUFFER_H__
|
||||
#ifndef \
|
||||
__TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_CIRCULAR_BUFFER_H__
|
||||
#define \
|
||||
__TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_CIRCULAR_BUFFER_H__
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class circular_buffer
|
||||
{
|
||||
public:
|
||||
public:
|
||||
explicit circular_buffer(int size=0);
|
||||
~circular_buffer();
|
||||
|
||||
explicit
|
||||
circular_buffer( int size = 0 );
|
||||
~circular_buffer();
|
||||
void resize(int size);
|
||||
void clear();
|
||||
|
||||
void resize( int size );
|
||||
void clear();
|
||||
T read();
|
||||
void write(const T &);
|
||||
|
||||
T read();
|
||||
void write( const T & );
|
||||
bool is_empty() const { return used() == 0; }
|
||||
bool is_full() const { return free() == 0; }
|
||||
|
||||
bool is_empty() const { return used() == 0; }
|
||||
bool is_full() const { return free() == 0; }
|
||||
int size() const { return m_size; }
|
||||
int used() const { return m_used; }
|
||||
int free() const { return m_free; }
|
||||
|
||||
int size() const { return m_size; }
|
||||
int used() const { return m_used; }
|
||||
int free() const { return m_free; }
|
||||
const T &read_data() const { return buf_read(m_buf, m_ri); }
|
||||
const T &
|
||||
peek_data(int i) const
|
||||
{
|
||||
return buf_read(m_buf, (m_ri + i) % size());
|
||||
}
|
||||
|
||||
const T& read_data() const
|
||||
{ return buf_read( m_buf, m_ri ); }
|
||||
T &
|
||||
poke_data(int i)
|
||||
{
|
||||
return buf_read(m_buf, (m_wi + i) % size());
|
||||
}
|
||||
|
||||
const T& peek_data( int i ) const
|
||||
{ return buf_read( m_buf, (m_ri + i) % size() ); }
|
||||
void debug() const;
|
||||
|
||||
T & poke_data( int i )
|
||||
{ return buf_read( m_buf , (m_wi + i) % size() ); }
|
||||
private:
|
||||
void increment_write_pos(int i=1);
|
||||
void increment_read_pos(int i=1);
|
||||
|
||||
void debug() const;
|
||||
void init();
|
||||
|
||||
private:
|
||||
void increment_write_pos( int i = 1 );
|
||||
void increment_read_pos( int i = 1 );
|
||||
// Disabled.
|
||||
circular_buffer(const circular_buffer<T> &b);
|
||||
circular_buffer<T> &operator = (const circular_buffer<T> &);
|
||||
|
||||
void init();
|
||||
|
||||
circular_buffer( const circular_buffer<T> &b ); // disabled
|
||||
circular_buffer<T> &operator=( const circular_buffer<T> & ); // disabled
|
||||
|
||||
void* buf_alloc( int size );
|
||||
void buf_free( void*& buf );
|
||||
void buf_write( void* buf, int n, const T & t );
|
||||
T& buf_read( void* buf, int n ) const;
|
||||
void buf_clear( void* buf, int n );
|
||||
|
||||
private:
|
||||
int m_size; // size of the buffer
|
||||
void* m_buf; // the buffer
|
||||
int m_free; // number of free spaces
|
||||
int m_used; // number of used spaces
|
||||
int m_ri; // index of next read
|
||||
int m_wi; // index of next write
|
||||
void *buf_alloc(int size);
|
||||
void buf_free(void *&buf);
|
||||
void buf_write(void *buf, int n, const T &t);
|
||||
T &buf_read(void *buf, int n) const;
|
||||
void buf_clear(void *buf, int n);
|
||||
|
||||
private:
|
||||
int m_size; // size of the buffer
|
||||
void *m_buf; // the buffer
|
||||
int m_free; // number of free spaces
|
||||
int m_used; // number of used spaces
|
||||
int m_ri; // index of next read
|
||||
int m_wi; // index of next write
|
||||
};
|
||||
|
||||
template< typename T >
|
||||
template <typename T>
|
||||
void
|
||||
circular_buffer<T>::debug() const
|
||||
{
|
||||
std::cout << "Buffer debug" << std::endl;
|
||||
std::cout << "Size : " << size() << std::endl;
|
||||
std::cout << "Free/Used " << free() << "/" << used() << std::endl;
|
||||
std::cout << "Indices : r/w = " << m_ri << "/" << m_wi << std::endl;
|
||||
|
||||
std::cout << "Buffer debug" << std::endl;
|
||||
std::cout << "Size : " << size() << std::endl;
|
||||
std::cout << "Free/Used " << free() << "/" << used() << std::endl;
|
||||
std::cout << "Indices : r/w = " << m_ri << "/" << m_wi << std::endl;
|
||||
|
||||
if( is_empty() ) {
|
||||
|
||||
std::cout << "empty" << std::endl;
|
||||
|
||||
}
|
||||
|
||||
if( is_full() ) {
|
||||
|
||||
std::cout << "full" << std::endl;
|
||||
|
||||
}
|
||||
|
||||
std::cout << "Data : " << std::endl;
|
||||
for( int i = 0; i < used(); i++ ) {
|
||||
|
||||
std::cout << peek_data( i ) << std::endl;
|
||||
|
||||
}
|
||||
if (is_empty()) {
|
||||
std::cout << "empty" << std::endl;
|
||||
}
|
||||
|
||||
if (is_full()) {
|
||||
std::cout << "full" << std::endl;
|
||||
}
|
||||
|
||||
std::cout << "Data : " << std::endl;
|
||||
for (int i = 0; i < used(); i++) {
|
||||
std::cout << peek_data( i ) << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
circular_buffer<T>::circular_buffer( int size )
|
||||
: m_size(size)
|
||||
, m_buf(0)
|
||||
template <typename T>
|
||||
circular_buffer<T>::circular_buffer(int size) : m_size(size), m_buf(0)
|
||||
{
|
||||
init();
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
void
|
||||
circular_buffer<T>::clear()
|
||||
{
|
||||
for( int i=0; i < used(); i++ ) {
|
||||
buf_clear( m_buf, (m_ri + i) % m_size );
|
||||
}
|
||||
m_free = m_size;
|
||||
m_used = m_ri = m_wi = 0;
|
||||
for (int i = 0; i < used(); i++) {
|
||||
buf_clear(m_buf, (m_ri + i) % m_size);
|
||||
}
|
||||
m_free = m_size;
|
||||
m_used = m_ri = m_wi = 0;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
circular_buffer<T>::~circular_buffer()
|
||||
{
|
||||
clear();
|
||||
buf_free( m_buf );
|
||||
clear();
|
||||
buf_free(m_buf);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
void
|
||||
circular_buffer<T>::resize( int size )
|
||||
circular_buffer<T>::resize(int size)
|
||||
{
|
||||
int i;
|
||||
void *new_buf = buf_alloc(size);
|
||||
|
||||
int i;
|
||||
void * new_buf = buf_alloc(size);
|
||||
for (i = 0; i < size && i < used(); i++) {
|
||||
buf_write(new_buf, i, peek_data(i));
|
||||
buf_clear(m_buf, (m_ri + i) % m_size);
|
||||
}
|
||||
|
||||
for( i = 0; i < size && i < used(); i++ ) {
|
||||
buf_free(m_buf);
|
||||
|
||||
buf_write( new_buf, i, peek_data( i ) );
|
||||
buf_clear( m_buf, (m_ri + i) % m_size );
|
||||
m_size = size;
|
||||
m_ri = 0;
|
||||
m_wi = i % m_size;
|
||||
m_used = i;
|
||||
m_free = m_size - m_used;
|
||||
|
||||
}
|
||||
|
||||
buf_free( m_buf );
|
||||
|
||||
m_size = size;
|
||||
m_ri = 0;
|
||||
m_wi = i % m_size;
|
||||
m_used = i;
|
||||
m_free = m_size - m_used;
|
||||
|
||||
m_buf = new_buf;
|
||||
m_buf = new_buf;
|
||||
}
|
||||
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
void
|
||||
circular_buffer<T>::init() {
|
||||
|
||||
if( m_size > 0 ) {
|
||||
m_buf = buf_alloc( m_size );
|
||||
}
|
||||
|
||||
m_free = m_size;
|
||||
m_used = 0;
|
||||
m_ri = 0;
|
||||
m_wi = 0;
|
||||
circular_buffer<T>::init()
|
||||
{
|
||||
if (m_size > 0) {
|
||||
m_buf = buf_alloc(m_size);
|
||||
}
|
||||
|
||||
m_free = m_size;
|
||||
m_used = 0;
|
||||
m_ri = 0;
|
||||
m_wi = 0;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
T
|
||||
circular_buffer<T>::read()
|
||||
{
|
||||
T t = read_data();
|
||||
T t = read_data();
|
||||
|
||||
buf_clear( m_buf, m_ri );
|
||||
increment_read_pos();
|
||||
buf_clear(m_buf, m_ri);
|
||||
increment_read_pos();
|
||||
|
||||
return t;
|
||||
return t;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
void
|
||||
circular_buffer<T>::write( const T &t )
|
||||
circular_buffer<T>::write(const T &t)
|
||||
{
|
||||
buf_write( m_buf, m_wi, t );
|
||||
increment_write_pos();
|
||||
buf_write(m_buf, m_wi, t);
|
||||
increment_write_pos();
|
||||
}
|
||||
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
void
|
||||
circular_buffer<T>::increment_write_pos( int i ) {
|
||||
|
||||
m_wi = ( m_wi + i ) % m_size;
|
||||
m_used += i;
|
||||
m_free -= i;
|
||||
|
||||
circular_buffer<T>::increment_write_pos(int i)
|
||||
{
|
||||
m_wi = (m_wi + i) % m_size;
|
||||
m_used += i;
|
||||
m_free -= i;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
void
|
||||
circular_buffer<T>::increment_read_pos( int i ) {
|
||||
|
||||
m_ri = ( m_ri + i ) % m_size;
|
||||
m_used -= i;
|
||||
m_free += i;
|
||||
|
||||
circular_buffer<T>::increment_read_pos(int i)
|
||||
{
|
||||
m_ri = (m_ri + i) % m_size;
|
||||
m_used -= i;
|
||||
m_free += i;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
inline void*
|
||||
circular_buffer<T>::buf_alloc( int size )
|
||||
{ return new unsigned char[ size * sizeof(T) ]; }
|
||||
|
||||
template < typename T >
|
||||
inline void
|
||||
circular_buffer<T>::buf_free( void* & buf )
|
||||
{ delete [] static_cast<unsigned char*>(buf); buf = 0; }
|
||||
|
||||
template < typename T >
|
||||
inline void
|
||||
circular_buffer<T>::buf_write( void* buf, int n, const T & t )
|
||||
template <typename T>
|
||||
inline void *
|
||||
circular_buffer<T>::buf_alloc(int size)
|
||||
{
|
||||
T* p = static_cast<T*>(buf) + n;
|
||||
new (p) T(t);
|
||||
return new unsigned char [size * sizeof(T)];
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
inline T&
|
||||
circular_buffer<T>::buf_read( void* buf, int n ) const
|
||||
template <typename T>
|
||||
inline void
|
||||
circular_buffer<T>::buf_free(void *&buf)
|
||||
{
|
||||
T* p = static_cast<T*>(buf) + n;
|
||||
return *p;
|
||||
delete [] static_cast<unsigned char *>(buf);
|
||||
buf = nullptr;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
inline void
|
||||
circular_buffer<T>::buf_clear( void* buf, int n )
|
||||
circular_buffer<T>::buf_write(void *buf, int n, const T &t)
|
||||
{
|
||||
T* p = static_cast<T*>(buf) + n;
|
||||
p->~T();
|
||||
T *p = static_cast<T *>(buf) + n;
|
||||
new (p)T(t);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline T &
|
||||
circular_buffer<T>::buf_read(void *buf, int n) const
|
||||
{
|
||||
T *p = static_cast<T *>(buf) + n;
|
||||
return *p;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline void
|
||||
circular_buffer<T>::buf_clear(void *buf, int n)
|
||||
{
|
||||
T *p = static_cast<T *>(buf) + n;
|
||||
p->~T();
|
||||
}
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
|
||||
/* __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_CIRCULAR_BUFFER_H__ */
|
||||
|
||||
@@ -17,8 +17,10 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_FIFO_H__
|
||||
#define __TLM_FIFO_H__
|
||||
#ifndef \
|
||||
__SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_H__
|
||||
#define \
|
||||
__SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_H__
|
||||
|
||||
//
|
||||
// This implements put, get and peek
|
||||
@@ -34,171 +36,147 @@
|
||||
// actual physical buffer.
|
||||
//
|
||||
|
||||
//#include <systemc>
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_fifo_ifs.h"
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/circular_buffer.h"
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
template <typename T>
|
||||
class tlm_fifo :
|
||||
public virtual tlm_fifo_get_if<T>,
|
||||
public virtual tlm_fifo_put_if<T>,
|
||||
public sc_core::sc_prim_channel
|
||||
class tlm_fifo : public virtual tlm_fifo_get_if<T>,
|
||||
public virtual tlm_fifo_put_if<T>, public sc_core::sc_prim_channel
|
||||
{
|
||||
public:
|
||||
|
||||
// constructors
|
||||
|
||||
explicit tlm_fifo( int size_ = 1 )
|
||||
: sc_core::sc_prim_channel( sc_core::sc_gen_unique_name( "fifo" ) ) {
|
||||
|
||||
init( size_ );
|
||||
|
||||
public:
|
||||
// Constructors.
|
||||
explicit tlm_fifo(int size_=1) :
|
||||
sc_core::sc_prim_channel(sc_core::sc_gen_unique_name("fifo"))
|
||||
{
|
||||
init(size_);
|
||||
}
|
||||
|
||||
explicit tlm_fifo( const char* name_, int size_ = 1 )
|
||||
: sc_core::sc_prim_channel( name_ ) {
|
||||
|
||||
init( size_ );
|
||||
|
||||
explicit tlm_fifo(const char *name_, int size_=1) :
|
||||
sc_core::sc_prim_channel(name_)
|
||||
{
|
||||
init(size_);
|
||||
}
|
||||
|
||||
// destructor
|
||||
|
||||
// Destructor..
|
||||
virtual ~tlm_fifo() {}
|
||||
|
||||
// tlm get interface
|
||||
// Tlm get interface.
|
||||
T get(tlm_tag<T> * =nullptr);
|
||||
|
||||
T get( tlm_tag<T> * = 0 );
|
||||
|
||||
bool nb_get( T& );
|
||||
bool nb_can_get( tlm_tag<T> * = 0 ) const;
|
||||
const sc_core::sc_event &ok_to_get( tlm_tag<T> * = 0 ) const {
|
||||
return m_data_written_event;
|
||||
bool nb_get(T &);
|
||||
bool nb_can_get(tlm_tag<T> * =nullptr) const;
|
||||
const sc_core::sc_event &
|
||||
ok_to_get(tlm_tag<T> * =nullptr) const
|
||||
{
|
||||
return m_data_written_event;
|
||||
}
|
||||
|
||||
// tlm peek interface
|
||||
// Tlm peek interface.
|
||||
T peek(tlm_tag<T> * =nullptr) const;
|
||||
|
||||
T peek( tlm_tag<T> * = 0 ) const;
|
||||
|
||||
bool nb_peek( T& ) const;
|
||||
bool nb_can_peek( tlm_tag<T> * = 0 ) const;
|
||||
const sc_core::sc_event &ok_to_peek( tlm_tag<T> * = 0 ) const {
|
||||
return m_data_written_event;
|
||||
bool nb_peek(T &) const;
|
||||
bool nb_can_peek(tlm_tag<T> * =nullptr) const;
|
||||
const sc_core::sc_event &
|
||||
ok_to_peek(tlm_tag<T> * =nullptr) const
|
||||
{
|
||||
return m_data_written_event;
|
||||
}
|
||||
|
||||
// tlm put interface
|
||||
// Tlm put interface.
|
||||
void put(const T &);
|
||||
|
||||
void put( const T& );
|
||||
|
||||
bool nb_put( const T& );
|
||||
bool nb_can_put( tlm_tag<T> * = 0 ) const;
|
||||
|
||||
const sc_core::sc_event& ok_to_put( tlm_tag<T> * = 0 ) const {
|
||||
return m_data_read_event;
|
||||
bool nb_put(const T &);
|
||||
bool nb_can_put(tlm_tag<T> * =nullptr) const;
|
||||
const sc_core::sc_event &
|
||||
ok_to_put(tlm_tag<T> * =nullptr) const
|
||||
{
|
||||
return m_data_read_event;
|
||||
}
|
||||
|
||||
// resize if
|
||||
// Resize if.
|
||||
void nb_expand(unsigned int n=1);
|
||||
void nb_unbound(unsigned int n=16);
|
||||
|
||||
void nb_expand( unsigned int n = 1 );
|
||||
void nb_unbound( unsigned int n = 16 );
|
||||
bool nb_reduce(unsigned int n=1);
|
||||
bool nb_bound(unsigned int n);
|
||||
|
||||
bool nb_reduce( unsigned int n = 1 );
|
||||
bool nb_bound( unsigned int n );
|
||||
// Debug interface.
|
||||
bool nb_peek(T &, int n) const;
|
||||
bool nb_poke(const T &, int n=0);
|
||||
|
||||
// debug interface
|
||||
int used() const { return m_num_readable - m_num_read; }
|
||||
int size() const { return m_size; }
|
||||
|
||||
bool nb_peek( T & , int n ) const;
|
||||
bool nb_poke( const T & , int n = 0 );
|
||||
void
|
||||
debug() const
|
||||
{
|
||||
if (is_empty())
|
||||
std::cout << "empty" << std::endl;
|
||||
if (is_full())
|
||||
std::cout << "full" << std::endl;
|
||||
|
||||
int used() const {
|
||||
return m_num_readable - m_num_read;
|
||||
std::cout << "size " << size() << " - " << used() << " used "
|
||||
<< std::endl;
|
||||
std::cout << "readable " << m_num_readable << std::endl;
|
||||
std::cout << "written/read " << m_num_written << "/" << m_num_read
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
int size() const {
|
||||
return m_size;
|
||||
// Support functions.
|
||||
static const char * const kind_string;
|
||||
const char *kind() const { return kind_string; }
|
||||
|
||||
protected:
|
||||
sc_core::sc_event &
|
||||
read_event(tlm_tag<T> * =nullptr)
|
||||
{
|
||||
return m_data_read_event;
|
||||
}
|
||||
|
||||
void debug() const {
|
||||
|
||||
if( is_empty() ) std::cout << "empty" << std::endl;
|
||||
if( is_full() ) std::cout << "full" << std::endl;
|
||||
|
||||
std::cout << "size " << size() << " - " << used() << " used "
|
||||
<< std::endl;
|
||||
std::cout << "readable " << m_num_readable
|
||||
<< std::endl;
|
||||
std::cout << "written/read " << m_num_written << "/" << m_num_read
|
||||
<< std::endl;
|
||||
|
||||
}
|
||||
|
||||
// support functions
|
||||
|
||||
static const char* const kind_string;
|
||||
|
||||
const char* kind() const
|
||||
{ return kind_string; }
|
||||
|
||||
|
||||
protected:
|
||||
sc_core::sc_event &read_event( tlm_tag<T> * = 0 ) {
|
||||
return m_data_read_event;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
void update();
|
||||
|
||||
// support methods
|
||||
|
||||
void init( int );
|
||||
|
||||
protected:
|
||||
void init(int);
|
||||
|
||||
circular_buffer<T> buffer;
|
||||
|
||||
int m_size; // logical size of fifo
|
||||
int m_size; // logical size of fifo
|
||||
|
||||
int m_num_readable; // #samples readable
|
||||
int m_num_read; // #samples read during this delta cycle
|
||||
int m_num_written; // #samples written during this delta cycle
|
||||
bool m_expand; // has an expand occurred during this delta cycle ?
|
||||
int m_num_read_no_notify; // #samples read without notify during this delta cycle
|
||||
int m_num_readable; // #samples readable
|
||||
int m_num_read; // #samples read during this delta cycle
|
||||
int m_num_written; // #samples written during this delta cycle
|
||||
bool m_expand; // has an expand occurred during this delta cycle ?
|
||||
// #samples read without notify during this delta cycle
|
||||
int m_num_read_no_notify;
|
||||
|
||||
sc_core::sc_event m_data_read_event;
|
||||
sc_core::sc_event m_data_written_event;
|
||||
|
||||
private:
|
||||
|
||||
private:
|
||||
// disabled
|
||||
tlm_fifo( const tlm_fifo<T>& );
|
||||
tlm_fifo& operator = ( const tlm_fifo<T>& );
|
||||
tlm_fifo(const tlm_fifo<T> &);
|
||||
tlm_fifo &operator = (const tlm_fifo<T> &);
|
||||
|
||||
//
|
||||
// use nb_can_get() and nb_can_put() rather than the following two
|
||||
// private functions
|
||||
//
|
||||
|
||||
bool is_empty() const {
|
||||
return used() == 0;
|
||||
}
|
||||
bool is_empty() const { return used() == 0; }
|
||||
|
||||
bool is_full() const {
|
||||
//return size() == m_num_readable + m_num_written; // Old buggy code
|
||||
if( size() < 0 )
|
||||
return false;
|
||||
else
|
||||
return size() <= m_num_readable + m_num_written;
|
||||
bool
|
||||
is_full() const
|
||||
{
|
||||
if (size() < 0)
|
||||
return false;
|
||||
else
|
||||
return size() <= m_num_readable + m_num_written;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
const char* const tlm_fifo<T>::kind_string = "tlm_fifo";
|
||||
|
||||
const char *const tlm_fifo<T>::kind_string = "tlm_fifo";
|
||||
|
||||
/******************************************************************
|
||||
//
|
||||
@@ -206,43 +184,36 @@ const char* const tlm_fifo<T>::kind_string = "tlm_fifo";
|
||||
//
|
||||
******************************************************************/
|
||||
|
||||
template< typename T >
|
||||
inline
|
||||
void
|
||||
tlm_fifo<T>::init( int size_ ) {
|
||||
|
||||
if( size_ > 0 ) {
|
||||
buffer.resize( size_ );
|
||||
}
|
||||
|
||||
else if( size_ < 0 ) {
|
||||
buffer.resize( -size_ );
|
||||
}
|
||||
|
||||
else {
|
||||
buffer.resize( 16 );
|
||||
}
|
||||
|
||||
m_size = size_;
|
||||
m_num_readable = 0;
|
||||
m_num_read = 0;
|
||||
m_num_written = 0;
|
||||
m_expand = false;
|
||||
m_num_read_no_notify = false;
|
||||
|
||||
}
|
||||
|
||||
template < typename T>
|
||||
inline
|
||||
void
|
||||
tlm_fifo<T>::update()
|
||||
template <typename T>
|
||||
inline void
|
||||
tlm_fifo<T>::init(int size_)
|
||||
{
|
||||
if( m_num_read > m_num_read_no_notify || m_expand ) {
|
||||
m_data_read_event.notify( sc_core::SC_ZERO_TIME );
|
||||
if (size_ > 0) {
|
||||
buffer.resize( size_ );
|
||||
} else if (size_ < 0) {
|
||||
buffer.resize(-size_);
|
||||
} else {
|
||||
buffer.resize(16);
|
||||
}
|
||||
|
||||
if( m_num_written > 0 ) {
|
||||
m_data_written_event.notify( sc_core::SC_ZERO_TIME );
|
||||
m_size = size_;
|
||||
m_num_readable = 0;
|
||||
m_num_read = 0;
|
||||
m_num_written = 0;
|
||||
m_expand = false;
|
||||
m_num_read_no_notify = false;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline void
|
||||
tlm_fifo<T>::update()
|
||||
{
|
||||
if (m_num_read > m_num_read_no_notify || m_expand) {
|
||||
m_data_read_event.notify(sc_core::SC_ZERO_TIME);
|
||||
}
|
||||
|
||||
if (m_num_written > 0) {
|
||||
m_data_written_event.notify(sc_core::SC_ZERO_TIME);
|
||||
}
|
||||
|
||||
m_expand = false;
|
||||
@@ -250,7 +221,6 @@ tlm_fifo<T>::update()
|
||||
m_num_written = 0;
|
||||
m_num_readable = buffer.used();
|
||||
m_num_read_no_notify = 0;
|
||||
|
||||
}
|
||||
|
||||
} // namespace tlm
|
||||
@@ -260,4 +230,4 @@ tlm_fifo<T>::update()
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo_resize.h"
|
||||
|
||||
#endif
|
||||
|
||||
/*__SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_H__*/
|
||||
|
||||
@@ -17,82 +17,74 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_FIFO_PEEK_H__
|
||||
#define __TLM_FIFO_PEEK_H__
|
||||
#ifndef \
|
||||
__TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_PEEK_H__
|
||||
#define \
|
||||
__TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_PEEK_H__
|
||||
|
||||
namespace tlm {
|
||||
|
||||
template < typename T>
|
||||
inline
|
||||
T
|
||||
tlm_fifo<T>::peek( tlm_tag<T> * ) const {
|
||||
|
||||
while( is_empty() ) {
|
||||
|
||||
// call free-standing sc_core::wait(),
|
||||
// since sc_prim_channel::wait(.) is not const
|
||||
|
||||
sc_core::wait( m_data_written_event );
|
||||
}
|
||||
|
||||
return buffer.read_data();
|
||||
|
||||
}
|
||||
|
||||
template < typename T>
|
||||
inline
|
||||
bool
|
||||
tlm_fifo<T>::nb_peek( T &t ) const {
|
||||
|
||||
if( used() < 1 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
t = buffer.peek_data( 0 );
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
template < typename T>
|
||||
inline
|
||||
bool
|
||||
tlm_fifo<T>::nb_peek( T &t , int n ) const {
|
||||
|
||||
if( n >= used() || n < -1 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if( n == -1 ) {
|
||||
n = used() - 1;
|
||||
}
|
||||
|
||||
t = buffer.peek_data( n );
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
template< typename T >
|
||||
inline
|
||||
bool
|
||||
tlm_fifo<T>::nb_can_peek( tlm_tag<T> * ) const
|
||||
namespace tlm
|
||||
{
|
||||
return !is_empty();
|
||||
|
||||
template <typename T>
|
||||
inline T
|
||||
tlm_fifo<T>::peek(tlm_tag<T> *) const
|
||||
{
|
||||
while (is_empty()) {
|
||||
// call free-standing sc_core::wait(),
|
||||
// since sc_prim_channel::wait(.) is not const
|
||||
sc_core::wait(m_data_written_event);
|
||||
}
|
||||
return buffer.read_data();
|
||||
}
|
||||
|
||||
template < typename T>
|
||||
inline
|
||||
bool
|
||||
tlm_fifo<T>::nb_poke( const T &t , int n ) {
|
||||
template <typename T>
|
||||
inline bool
|
||||
tlm_fifo<T>::nb_peek(T &t) const
|
||||
{
|
||||
if (used() < 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if( n >= used() || n < 0 ) {
|
||||
return false;
|
||||
}
|
||||
t = buffer.peek_data(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
buffer.poke_data( n ) = t;
|
||||
return true;
|
||||
template <typename T>
|
||||
inline bool
|
||||
tlm_fifo<T>::nb_peek(T &t, int n) const
|
||||
{
|
||||
if (n >= used() || n < -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (n == -1) {
|
||||
n = used() - 1;
|
||||
}
|
||||
|
||||
t = buffer.peek_data(n);
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline bool
|
||||
tlm_fifo<T>::nb_can_peek(tlm_tag<T> *) const
|
||||
{
|
||||
return !is_empty();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline bool
|
||||
tlm_fifo<T>::nb_poke(const T &t, int n)
|
||||
{
|
||||
if (n >= used() || n < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
buffer.poke_data(n) = t;
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
/* __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_PEEK_H__ */
|
||||
|
||||
@@ -17,124 +17,100 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_FIFO_PUT_GET_IF_H__
|
||||
#define __TLM_FIFO_PUT_GET_IF_H__
|
||||
#ifndef \
|
||||
__TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_PUT_GET_H__
|
||||
#define \
|
||||
__TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_PUT_GET_H__
|
||||
|
||||
namespace tlm {
|
||||
|
||||
/******************************************************************
|
||||
//
|
||||
// get interface
|
||||
//
|
||||
******************************************************************/
|
||||
|
||||
template <typename T>
|
||||
inline
|
||||
T
|
||||
tlm_fifo<T>::get( tlm_tag<T> * )
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
while( is_empty() ) {
|
||||
wait( m_data_written_event );
|
||||
}
|
||||
|
||||
m_num_read ++;
|
||||
request_update();
|
||||
|
||||
return buffer.read();
|
||||
|
||||
}
|
||||
|
||||
// non-blocking read
|
||||
|
||||
// Get interface.
|
||||
template <typename T>
|
||||
inline
|
||||
bool
|
||||
tlm_fifo<T>::nb_get( T& val_ )
|
||||
inline T
|
||||
tlm_fifo<T>::get(tlm_tag<T> *)
|
||||
{
|
||||
|
||||
if( is_empty() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_num_read ++;
|
||||
request_update();
|
||||
|
||||
val_ = buffer.read();
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline
|
||||
bool
|
||||
tlm_fifo<T>::nb_can_get( tlm_tag<T> * ) const {
|
||||
|
||||
return !is_empty();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************
|
||||
//
|
||||
// put interface
|
||||
//
|
||||
******************************************************************/
|
||||
|
||||
template <typename T>
|
||||
inline
|
||||
void
|
||||
tlm_fifo<T>::put( const T& val_ )
|
||||
{
|
||||
while( is_full() ) {
|
||||
wait( m_data_read_event );
|
||||
while (is_empty()) {
|
||||
wait(m_data_written_event);
|
||||
}
|
||||
|
||||
if( buffer.is_full() ) {
|
||||
m_num_read++;
|
||||
request_update();
|
||||
|
||||
buffer.resize( buffer.size() * 2 );
|
||||
return buffer.read();
|
||||
}
|
||||
|
||||
// Non-blocking read.
|
||||
template <typename T>
|
||||
inline bool
|
||||
tlm_fifo<T>::nb_get(T &val_)
|
||||
{
|
||||
if (is_empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_num_written ++;
|
||||
buffer.write( val_ );
|
||||
m_num_read++;
|
||||
request_update();
|
||||
|
||||
val_ = buffer.read();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline bool
|
||||
tlm_fifo<T>::nb_can_get(tlm_tag<T> *) const
|
||||
{
|
||||
return !is_empty();
|
||||
}
|
||||
|
||||
|
||||
// Put interface.
|
||||
template <typename T>
|
||||
inline void
|
||||
tlm_fifo<T>::put(const T &val_)
|
||||
{
|
||||
while (is_full()) {
|
||||
wait(m_data_read_event);
|
||||
}
|
||||
|
||||
if (buffer.is_full()) {
|
||||
buffer.resize(buffer.size() * 2);
|
||||
}
|
||||
|
||||
m_num_written++;
|
||||
buffer.write(val_);
|
||||
|
||||
request_update();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline
|
||||
bool
|
||||
tlm_fifo<T>::nb_put( const T& val_ )
|
||||
inline bool
|
||||
tlm_fifo<T>::nb_put(const T &val_)
|
||||
{
|
||||
if (is_full()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if( is_full() ) {
|
||||
return false;
|
||||
}
|
||||
if (buffer.is_full()) {
|
||||
buffer.resize(buffer.size() * 2);
|
||||
}
|
||||
|
||||
if( buffer.is_full() ) {
|
||||
m_num_written++;
|
||||
buffer.write(val_);
|
||||
request_update();
|
||||
|
||||
buffer.resize( buffer.size() * 2 );
|
||||
|
||||
}
|
||||
|
||||
m_num_written ++;
|
||||
buffer.write( val_ );
|
||||
request_update();
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
inline
|
||||
bool
|
||||
tlm_fifo<T>::nb_can_put( tlm_tag<T> * ) const {
|
||||
|
||||
return !is_full();
|
||||
|
||||
template <typename T>
|
||||
inline bool
|
||||
tlm_fifo<T>::nb_can_put(tlm_tag<T> *) const
|
||||
{
|
||||
return !is_full();
|
||||
}
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
/* __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_PUT_GET_H__ */
|
||||
|
||||
@@ -17,77 +17,67 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_FIFO_RESIZE_H__
|
||||
#define __TLM_FIFO_RESIZE_H__
|
||||
#ifndef \
|
||||
__TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_RESIZE_H__
|
||||
#define \
|
||||
__TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_RESIZE_H__
|
||||
|
||||
/******************************************************************
|
||||
//
|
||||
// resize interface
|
||||
//
|
||||
******************************************************************/
|
||||
// Resize interface.
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
namespace tlm {
|
||||
template <typename T>
|
||||
inline void
|
||||
tlm_fifo<T>::nb_expand(unsigned int n)
|
||||
{
|
||||
if (m_size >= 0) {
|
||||
m_expand = true;
|
||||
m_size += n;
|
||||
request_update();
|
||||
}
|
||||
}
|
||||
|
||||
template < typename T>
|
||||
inline
|
||||
void
|
||||
tlm_fifo<T>::nb_expand( unsigned int n ) {
|
||||
|
||||
if( m_size >= 0 ) {
|
||||
template <typename T>
|
||||
inline void
|
||||
tlm_fifo<T>::nb_unbound(unsigned int n)
|
||||
{
|
||||
m_expand = true;
|
||||
m_size += n;
|
||||
m_size = -n;
|
||||
|
||||
if (buffer.size() < static_cast<int>(n)) {
|
||||
buffer.resize(n);
|
||||
}
|
||||
|
||||
request_update();
|
||||
}
|
||||
}
|
||||
|
||||
template < typename T>
|
||||
inline
|
||||
void
|
||||
tlm_fifo<T>::nb_unbound( unsigned int n ) {
|
||||
|
||||
m_expand = true;
|
||||
m_size = -n;
|
||||
|
||||
if( buffer.size() < static_cast<int>( n ) ) {
|
||||
buffer.resize( n );
|
||||
}
|
||||
|
||||
request_update();
|
||||
template <typename T>
|
||||
inline bool
|
||||
tlm_fifo<T>::nb_reduce(unsigned int n)
|
||||
{
|
||||
if (m_size < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return nb_bound(size() - n);
|
||||
}
|
||||
|
||||
template < typename T>
|
||||
inline
|
||||
bool
|
||||
tlm_fifo<T>::nb_reduce( unsigned int n ) {
|
||||
template <typename T>
|
||||
inline bool
|
||||
tlm_fifo<T>::nb_bound(unsigned int new_size)
|
||||
{
|
||||
bool ret = true;
|
||||
|
||||
if( m_size < 0 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return nb_bound( size() - n );
|
||||
|
||||
}
|
||||
|
||||
template < typename T>
|
||||
inline
|
||||
bool
|
||||
tlm_fifo<T>::nb_bound( unsigned int new_size ) {
|
||||
|
||||
bool ret = true;
|
||||
|
||||
if( static_cast<int>( new_size ) < used() ) {
|
||||
|
||||
new_size = used();
|
||||
ret = false;
|
||||
|
||||
}
|
||||
|
||||
m_size = new_size;
|
||||
return ret;
|
||||
if (static_cast<int>(new_size) < used()) {
|
||||
new_size = used();
|
||||
ret = false;
|
||||
}
|
||||
|
||||
m_size = new_size;
|
||||
return ret;
|
||||
}
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
/* __TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_FIFO_TLM_FIFO_RESIZE_H__ */
|
||||
|
||||
@@ -17,98 +17,99 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
//
|
||||
// To the LRM writer : these classes are purely artifacts of the implementation.
|
||||
//
|
||||
|
||||
#ifndef __TLM_PUT_GET_IMP_H__
|
||||
#define __TLM_PUT_GET_IMP_H__
|
||||
#ifndef \
|
||||
__TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_REQ_RSP_CHANNELS_TLM_PUT_GET_IMP_H__
|
||||
#define \
|
||||
__TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_REQ_RSP_CHANNELS_TLM_PUT_GET_IMP_H__
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_master_slave_ifs.h"
|
||||
|
||||
namespace tlm {
|
||||
|
||||
template < typename PUT_DATA , typename GET_DATA>
|
||||
class tlm_put_get_imp :
|
||||
private virtual tlm_put_if< PUT_DATA > ,
|
||||
private virtual tlm_get_peek_if< GET_DATA >
|
||||
namespace tlm
|
||||
{
|
||||
public:
|
||||
tlm_put_get_imp( tlm_put_if<PUT_DATA> &p ,
|
||||
tlm_get_peek_if<GET_DATA> &g ) :
|
||||
put_fifo( p ) , get_fifo( g ) {}
|
||||
|
||||
// put interface
|
||||
template <typename PUT_DATA, typename GET_DATA>
|
||||
class tlm_put_get_imp : private virtual tlm_put_if<PUT_DATA>,
|
||||
private virtual tlm_get_peek_if<GET_DATA>
|
||||
{
|
||||
public:
|
||||
tlm_put_get_imp(tlm_put_if<PUT_DATA> &p, tlm_get_peek_if<GET_DATA> &g) :
|
||||
put_fifo(p), get_fifo(g)
|
||||
{}
|
||||
|
||||
void put( const PUT_DATA &t ) { put_fifo.put( t ); }
|
||||
// Put interface.
|
||||
void put(const PUT_DATA &t) { put_fifo.put(t); }
|
||||
bool nb_put(const PUT_DATA &t) { return put_fifo.nb_put(t); }
|
||||
bool
|
||||
nb_can_put(tlm_tag<PUT_DATA> *t=nullptr) const
|
||||
{
|
||||
return put_fifo.nb_can_put(t);
|
||||
}
|
||||
const sc_core::sc_event &
|
||||
ok_to_put(tlm_tag<PUT_DATA> *t=nullptr) const
|
||||
{
|
||||
return put_fifo.ok_to_put(t);
|
||||
}
|
||||
|
||||
bool nb_put( const PUT_DATA &t ) { return put_fifo.nb_put( t ); }
|
||||
bool nb_can_put( tlm_tag<PUT_DATA> *t = 0 ) const {
|
||||
return put_fifo.nb_can_put( t );
|
||||
}
|
||||
const sc_core::sc_event &ok_to_put( tlm_tag<PUT_DATA> *t = 0 ) const {
|
||||
return put_fifo.ok_to_put( t );
|
||||
}
|
||||
// Get interface.
|
||||
GET_DATA get(tlm_tag<GET_DATA> * =nullptr) { return get_fifo.get(); }
|
||||
bool nb_get(GET_DATA &t) { return get_fifo.nb_get(t); }
|
||||
bool
|
||||
nb_can_get(tlm_tag<GET_DATA> *t=nullptr) const
|
||||
{
|
||||
return get_fifo.nb_can_get(t);
|
||||
}
|
||||
|
||||
// get interface
|
||||
virtual const sc_core::sc_event &
|
||||
ok_to_get(tlm_tag<GET_DATA> *t=nullptr) const
|
||||
{
|
||||
return get_fifo.ok_to_get(t);
|
||||
}
|
||||
|
||||
GET_DATA get( tlm_tag<GET_DATA> * = 0 ) { return get_fifo.get(); }
|
||||
// Peek interface.
|
||||
GET_DATA
|
||||
peek(tlm_tag<GET_DATA> * =nullptr) const
|
||||
{
|
||||
return get_fifo.peek();
|
||||
}
|
||||
bool nb_peek(GET_DATA &t) const { return get_fifo.nb_peek(t); }
|
||||
bool
|
||||
nb_can_peek(tlm_tag<GET_DATA> *t=nullptr) const
|
||||
{
|
||||
return get_fifo.nb_can_peek(t);
|
||||
}
|
||||
|
||||
bool nb_get( GET_DATA &t ) { return get_fifo.nb_get( t ); }
|
||||
virtual const sc_core::sc_event &
|
||||
ok_to_peek(tlm_tag<GET_DATA> *t=nullptr) const
|
||||
{
|
||||
return get_fifo.ok_to_peek(t);
|
||||
}
|
||||
|
||||
bool nb_can_get( tlm_tag<GET_DATA> *t = 0 ) const {
|
||||
return get_fifo.nb_can_get( t );
|
||||
}
|
||||
|
||||
virtual const sc_core::sc_event &ok_to_get( tlm_tag<GET_DATA> *t = 0 ) const {
|
||||
return get_fifo.ok_to_get( t );
|
||||
}
|
||||
|
||||
// peek interface
|
||||
|
||||
GET_DATA peek( tlm_tag<GET_DATA> * = 0 ) const { return get_fifo.peek(); }
|
||||
|
||||
bool nb_peek( GET_DATA &t ) const { return get_fifo.nb_peek( t ); }
|
||||
|
||||
bool nb_can_peek( tlm_tag<GET_DATA> *t = 0 ) const {
|
||||
return get_fifo.nb_can_peek( t );
|
||||
}
|
||||
|
||||
virtual const sc_core::sc_event &ok_to_peek( tlm_tag<GET_DATA> *t = 0 ) const {
|
||||
return get_fifo.ok_to_peek( t );
|
||||
}
|
||||
|
||||
private:
|
||||
tlm_put_if<PUT_DATA> &put_fifo;
|
||||
tlm_get_peek_if<GET_DATA> &get_fifo;
|
||||
private:
|
||||
tlm_put_if<PUT_DATA> &put_fifo;
|
||||
tlm_get_peek_if<GET_DATA> &get_fifo;
|
||||
};
|
||||
|
||||
template < typename REQ , typename RSP >
|
||||
class tlm_master_imp :
|
||||
private tlm_put_get_imp< REQ , RSP > ,
|
||||
public virtual tlm_master_if< REQ , RSP >
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_master_imp : private tlm_put_get_imp<REQ, RSP>,
|
||||
public virtual tlm_master_if<REQ, RSP>
|
||||
{
|
||||
public:
|
||||
|
||||
tlm_master_imp( tlm_put_if<REQ> &req ,
|
||||
tlm_get_peek_if<RSP> &rsp ) :
|
||||
tlm_put_get_imp<REQ,RSP>( req , rsp ) {}
|
||||
|
||||
public:
|
||||
tlm_master_imp(tlm_put_if<REQ> &req, tlm_get_peek_if<RSP> &rsp) :
|
||||
tlm_put_get_imp<REQ, RSP>(req, rsp)
|
||||
{}
|
||||
};
|
||||
|
||||
template < typename REQ , typename RSP >
|
||||
class tlm_slave_imp :
|
||||
private tlm_put_get_imp< RSP , REQ > ,
|
||||
public virtual tlm_slave_if< REQ , RSP >
|
||||
template <typename REQ, typename RSP>
|
||||
class tlm_slave_imp : private tlm_put_get_imp<RSP, REQ>,
|
||||
public virtual tlm_slave_if<REQ, RSP>
|
||||
{
|
||||
public:
|
||||
|
||||
tlm_slave_imp( tlm_get_peek_if<REQ> &req ,
|
||||
tlm_put_if<RSP> &rsp ) :
|
||||
tlm_put_get_imp<RSP,REQ>( rsp , req ) {}
|
||||
|
||||
public:
|
||||
tlm_slave_imp(tlm_get_peek_if<REQ> &req, tlm_put_if<RSP> &rsp) :
|
||||
tlm_put_get_imp<RSP, REQ>(rsp, req)
|
||||
{}
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
/* __TLM_1_TLM_REQ_RSP_TLM_CHANNELS_TLM_REQ_RSP_CHANNELS_TLM_PUT_GET_IMP_H__ */
|
||||
|
||||
@@ -17,139 +17,124 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_REQ_RSP_CHANNELS_H__
|
||||
#define __TLM_REQ_RSP_CHANNELS_H__
|
||||
#ifndef \
|
||||
__TLM_REQ_RSP_TLM_CHANNELS_TLM_REQ_RSP_CHANNELS_TLM_REQ_RSP_CHANNELS_H__
|
||||
#define \
|
||||
__TLM_REQ_RSP_TLM_CHANNELS_TLM_REQ_RSP_CHANNELS_TLM_REQ_RSP_CHANNELS_H__
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_adapters/tlm_adapters.h"
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_fifo/tlm_fifo.h"
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_req_rsp_channels/tlm_put_get_imp.h"
|
||||
|
||||
namespace tlm {
|
||||
|
||||
template < typename REQ , typename RSP ,
|
||||
typename REQ_CHANNEL = tlm_fifo<REQ> ,
|
||||
typename RSP_CHANNEL = tlm_fifo<RSP> >
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
template <typename REQ, typename RSP, typename REQ_CHANNEL=tlm_fifo<REQ>,
|
||||
typename RSP_CHANNEL=tlm_fifo<RSP>>
|
||||
class tlm_req_rsp_channel : public sc_core::sc_module
|
||||
{
|
||||
public:
|
||||
// uni-directional slave interface
|
||||
public:
|
||||
// Uni-directional slave interface.
|
||||
sc_core::sc_export<tlm_fifo_get_if<REQ>> get_request_export;
|
||||
sc_core::sc_export<tlm_fifo_put_if<RSP>> put_response_export;
|
||||
|
||||
sc_core::sc_export< tlm_fifo_get_if< REQ > > get_request_export;
|
||||
sc_core::sc_export< tlm_fifo_put_if< RSP > > put_response_export;
|
||||
// Uni-directional master interface.
|
||||
sc_core::sc_export<tlm_fifo_put_if<REQ>> put_request_export;
|
||||
sc_core::sc_export<tlm_fifo_get_if<RSP>> get_response_export;
|
||||
|
||||
// uni-directional master interface
|
||||
// Master/slave interfaces.
|
||||
sc_core::sc_export<tlm_master_if<REQ, RSP>> master_export;
|
||||
sc_core::sc_export<tlm_slave_if<REQ, RSP>> slave_export;
|
||||
|
||||
sc_core::sc_export< tlm_fifo_put_if< REQ > > put_request_export;
|
||||
sc_core::sc_export< tlm_fifo_get_if< RSP > > get_response_export;
|
||||
tlm_req_rsp_channel(int req_size=1, int rsp_size=1) :
|
||||
sc_core::sc_module(sc_core::sc_module_name(
|
||||
sc_core::sc_gen_unique_name("tlm_req_rsp_channel"))),
|
||||
request_fifo(req_size), response_fifo(rsp_size),
|
||||
master(request_fifo, response_fifo),
|
||||
slave(request_fifo, response_fifo)
|
||||
{
|
||||
bind_exports();
|
||||
}
|
||||
|
||||
// master / slave interfaces
|
||||
tlm_req_rsp_channel(sc_core::sc_module_name module_name,
|
||||
int req_size=1, int rsp_size=1) :
|
||||
sc_core::sc_module(module_name),
|
||||
request_fifo(req_size), response_fifo(rsp_size),
|
||||
master(request_fifo, response_fifo),
|
||||
slave(request_fifo, response_fifo)
|
||||
{
|
||||
bind_exports();
|
||||
}
|
||||
|
||||
sc_core::sc_export< tlm_master_if< REQ , RSP > > master_export;
|
||||
sc_core::sc_export< tlm_slave_if< REQ , RSP > > slave_export;
|
||||
private:
|
||||
void
|
||||
bind_exports()
|
||||
{
|
||||
put_request_export(request_fifo);
|
||||
get_request_export(request_fifo);
|
||||
|
||||
put_response_export(response_fifo);
|
||||
get_response_export(response_fifo);
|
||||
|
||||
tlm_req_rsp_channel( int req_size = 1 , int rsp_size = 1 ) :
|
||||
sc_core::sc_module( sc_core::sc_module_name( sc_core::sc_gen_unique_name("tlm_req_rsp_channel") ) ) ,
|
||||
request_fifo( req_size ) ,
|
||||
response_fifo( rsp_size ) ,
|
||||
master( request_fifo , response_fifo ) ,
|
||||
slave( request_fifo , response_fifo )
|
||||
{
|
||||
master_export(master);
|
||||
slave_export(slave);
|
||||
}
|
||||
|
||||
bind_exports();
|
||||
protected:
|
||||
REQ_CHANNEL request_fifo;
|
||||
RSP_CHANNEL response_fifo;
|
||||
|
||||
}
|
||||
|
||||
tlm_req_rsp_channel( sc_core::sc_module_name module_name ,
|
||||
int req_size = 1 , int rsp_size = 1 ) :
|
||||
sc_core::sc_module( module_name ) ,
|
||||
request_fifo( req_size ) ,
|
||||
response_fifo( rsp_size ) ,
|
||||
master( request_fifo , response_fifo ) ,
|
||||
slave( request_fifo , response_fifo )
|
||||
{
|
||||
|
||||
bind_exports();
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
void bind_exports() {
|
||||
|
||||
put_request_export( request_fifo );
|
||||
get_request_export( request_fifo );
|
||||
|
||||
put_response_export( response_fifo );
|
||||
get_response_export( response_fifo );
|
||||
|
||||
master_export( master );
|
||||
slave_export( slave );
|
||||
|
||||
}
|
||||
|
||||
protected:
|
||||
REQ_CHANNEL request_fifo;
|
||||
RSP_CHANNEL response_fifo;
|
||||
|
||||
tlm_master_imp< REQ , RSP > master;
|
||||
tlm_slave_imp< REQ , RSP > slave;
|
||||
tlm_master_imp<REQ, RSP> master;
|
||||
tlm_slave_imp<REQ, RSP> slave;
|
||||
};
|
||||
|
||||
template < typename REQ , typename RSP ,
|
||||
typename REQ_CHANNEL = tlm_fifo<REQ> ,
|
||||
typename RSP_CHANNEL = tlm_fifo<RSP> >
|
||||
template <typename REQ, typename RSP,
|
||||
typename REQ_CHANNEL=tlm_fifo<REQ>,
|
||||
typename RSP_CHANNEL=tlm_fifo<RSP>>
|
||||
class tlm_transport_channel : public sc_core::sc_module
|
||||
{
|
||||
public:
|
||||
public:
|
||||
// Master transport interface.
|
||||
sc_core::sc_export<tlm_transport_if<REQ, RSP>> target_export;
|
||||
|
||||
// master transport interface
|
||||
// Slave interfaces.
|
||||
sc_core::sc_export<tlm_fifo_get_if<REQ>> get_request_export;
|
||||
sc_core::sc_export<tlm_fifo_put_if<RSP>> put_response_export;
|
||||
|
||||
sc_core::sc_export< tlm_transport_if< REQ , RSP > > target_export;
|
||||
sc_core::sc_export<tlm_slave_if<REQ, RSP>> slave_export;
|
||||
|
||||
// slave interfaces
|
||||
tlm_transport_channel() :
|
||||
sc_core::sc_module(sc_core::sc_module_name(
|
||||
sc_core::sc_gen_unique_name("transport_channel"))),
|
||||
target_export("target_export"), req_rsp("req_rsp", 1, 1), t2m("ts2m")
|
||||
{
|
||||
do_binding();
|
||||
}
|
||||
|
||||
sc_core::sc_export< tlm_fifo_get_if< REQ > > get_request_export;
|
||||
sc_core::sc_export< tlm_fifo_put_if< RSP > > put_response_export;
|
||||
tlm_transport_channel(sc_core::sc_module_name nm) :
|
||||
sc_core::sc_module(nm), target_export("target_export"),
|
||||
req_rsp("req_rsp", 1, 1), t2m("tsm")
|
||||
{
|
||||
do_binding();
|
||||
}
|
||||
|
||||
sc_core::sc_export< tlm_slave_if< REQ , RSP > > slave_export;
|
||||
private:
|
||||
void
|
||||
do_binding()
|
||||
{
|
||||
target_export(t2m.target_export);
|
||||
t2m.master_port(req_rsp.master_export);
|
||||
|
||||
tlm_transport_channel() :
|
||||
sc_core::sc_module( sc_core::sc_module_name( sc_core::sc_gen_unique_name("transport_channel" ) ) ) ,
|
||||
target_export("target_export") ,
|
||||
req_rsp( "req_rsp" , 1 , 1 ) ,
|
||||
t2m("ts2m")
|
||||
{
|
||||
do_binding();
|
||||
}
|
||||
|
||||
tlm_transport_channel( sc_core::sc_module_name nm ) :
|
||||
sc_core::sc_module( nm ) ,
|
||||
target_export("target_export") ,
|
||||
req_rsp( "req_rsp" , 1 , 1 ) ,
|
||||
t2m("tsm" )
|
||||
{
|
||||
do_binding();
|
||||
}
|
||||
|
||||
private:
|
||||
void do_binding() {
|
||||
|
||||
target_export( t2m.target_export );
|
||||
|
||||
t2m.master_port( req_rsp.master_export );
|
||||
|
||||
get_request_export( req_rsp.get_request_export );
|
||||
put_response_export( req_rsp.put_response_export );
|
||||
slave_export( req_rsp.slave_export );
|
||||
|
||||
}
|
||||
|
||||
tlm_req_rsp_channel< REQ , RSP , REQ_CHANNEL , RSP_CHANNEL > req_rsp;
|
||||
tlm_transport_to_master< REQ , RSP > t2m;
|
||||
get_request_export(req_rsp.get_request_export);
|
||||
put_response_export(req_rsp.put_response_export);
|
||||
slave_export(req_rsp.slave_export);
|
||||
}
|
||||
|
||||
tlm_req_rsp_channel<REQ, RSP, REQ_CHANNEL, RSP_CHANNEL> req_rsp;
|
||||
tlm_transport_to_master<REQ, RSP> t2m;
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
/* __TLM_REQ_RSP_TLM_CHANNELS_TLM_REQ_RSP_CHANNELS_TLM_REQ_RSP_CHANNELS_H__ */
|
||||
|
||||
@@ -17,60 +17,53 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_CORE_TLM_EVENT_FINDER_H_INCLUDED_
|
||||
#define TLM_CORE_TLM_EVENT_FINDER_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_PORTS_TLM_EVENT_FINDER_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_PORTS_TLM_EVENT_FINDER_H__
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_tag.h"
|
||||
|
||||
namespace tlm {
|
||||
|
||||
template <class IF , class T>
|
||||
class tlm_event_finder_t
|
||||
: public sc_core::sc_event_finder
|
||||
namespace tlm
|
||||
{
|
||||
public:
|
||||
|
||||
// constructor
|
||||
template <class IF, class T>
|
||||
class tlm_event_finder_t : public sc_core::sc_event_finder
|
||||
{
|
||||
public:
|
||||
tlm_event_finder_t(const sc_core::sc_port_base &port_,
|
||||
const sc_core::sc_event &(IF::*event_method_)(
|
||||
tlm_tag<T> *) const) :
|
||||
sc_core::sc_event_finder(port_), m_event_method(event_method_)
|
||||
{}
|
||||
|
||||
tlm_event_finder_t( const sc_core::sc_port_base& port_,
|
||||
const sc_core::sc_event& (IF::*event_method_) ( tlm_tag<T> * ) const )
|
||||
: sc_core::sc_event_finder( port_ ), m_event_method( event_method_ )
|
||||
{}
|
||||
virtual ~tlm_event_finder_t() {}
|
||||
|
||||
// destructor (does nothing)
|
||||
virtual const sc_core::sc_event &
|
||||
find_event(sc_core::sc_interface *if_p=nullptr) const;
|
||||
|
||||
virtual ~tlm_event_finder_t()
|
||||
{}
|
||||
|
||||
virtual const sc_core::sc_event& find_event( sc_core::sc_interface* if_p = 0 ) const;
|
||||
|
||||
private:
|
||||
|
||||
const sc_core::sc_event& (IF::*m_event_method) ( tlm_tag<T> * ) const;
|
||||
|
||||
private:
|
||||
private:
|
||||
const sc_core::sc_event &(IF::*m_event_method)(tlm_tag<T> *) const;
|
||||
|
||||
private:
|
||||
// disabled
|
||||
tlm_event_finder_t();
|
||||
tlm_event_finder_t( const tlm_event_finder_t<IF,T>& );
|
||||
tlm_event_finder_t<IF,T>& operator = ( const tlm_event_finder_t<IF,T>& );
|
||||
tlm_event_finder_t(const tlm_event_finder_t<IF, T> &);
|
||||
tlm_event_finder_t<IF, T> &operator = (const tlm_event_finder_t<IF, T> &);
|
||||
};
|
||||
|
||||
|
||||
template <class IF , class T>
|
||||
inline
|
||||
const sc_core::sc_event&
|
||||
tlm_event_finder_t<IF,T>::find_event( sc_core::sc_interface* if_p ) const
|
||||
template <class IF, class T>
|
||||
inline const sc_core::sc_event &
|
||||
tlm_event_finder_t<IF, T>::find_event(sc_core::sc_interface *if_p) const
|
||||
{
|
||||
const IF* iface = ( if_p ) ? dynamic_cast<const IF*>( if_p ) :
|
||||
dynamic_cast<const IF*>( port().get_interface() );
|
||||
if( iface == 0 ) {
|
||||
report_error( sc_core::SC_ID_FIND_EVENT_, "port is not bound" );
|
||||
const IF *iface = if_p ? dynamic_cast<const IF *>(if_p) :
|
||||
dynamic_cast<const IF *>(port().get_interface());
|
||||
if (iface == nullptr) {
|
||||
report_error(sc_core::SC_ID_FIND_EVENT_, "port is not bound");
|
||||
return sc_core::sc_event::none;
|
||||
}
|
||||
return (const_cast<IF*>( iface )->*m_event_method) ( 0 );
|
||||
return (const_cast<IF *>(iface)->*m_event_method)(nullptr);
|
||||
}
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif // TLM_CORE_TLM_EVENT_FINDER_H_INCLUDED_
|
||||
// __SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_PORTS_TLM_EVENT_FINDER_H__
|
||||
#endif
|
||||
|
||||
@@ -17,75 +17,75 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_NONBLOCKING_PORT_H__
|
||||
#define __TLM_NONBLOCKING_PORT_H__
|
||||
#ifndef \
|
||||
__SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_PORTS_TLM_NONBLOCKING_PORT_H__
|
||||
#define \
|
||||
__SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_PORTS_TLM_NONBLOCKING_PORT_H__
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_core_ifs.h"
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_ports/tlm_event_finder.h"
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_nonblocking_get_port :
|
||||
public sc_core::sc_port< tlm_nonblocking_get_if< T > , 1 >
|
||||
public sc_core::sc_port<tlm_nonblocking_get_if<T>, 1>
|
||||
{
|
||||
public:
|
||||
typedef tlm_nonblocking_get_if<T> get_if_type;
|
||||
public:
|
||||
typedef tlm_nonblocking_get_if<T> get_if_type;
|
||||
|
||||
tlm_nonblocking_get_port( const char *port_name ) :
|
||||
sc_core::sc_port< tlm_nonblocking_get_if< T > , 1 >( port_name ) {}
|
||||
|
||||
sc_core::sc_event_finder& ok_to_get() const {
|
||||
|
||||
return *new tlm_event_finder_t< get_if_type , T >(
|
||||
*this,
|
||||
&get_if_type::ok_to_get );
|
||||
|
||||
}
|
||||
tlm_nonblocking_get_port(const char *port_name) :
|
||||
sc_core::sc_port<tlm_nonblocking_get_if<T>, 1>(port_name)
|
||||
{}
|
||||
|
||||
sc_core::sc_event_finder &
|
||||
ok_to_get() const
|
||||
{
|
||||
return *new tlm_event_finder_t<get_if_type, T >(
|
||||
*this, &get_if_type::ok_to_get);
|
||||
}
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_nonblocking_peek_port :
|
||||
public sc_core::sc_port< tlm_nonblocking_peek_if< T > , 1 >
|
||||
public sc_core::sc_port<tlm_nonblocking_peek_if<T>, 1>
|
||||
{
|
||||
public:
|
||||
typedef tlm_nonblocking_peek_if<T> peek_if_type;
|
||||
public:
|
||||
typedef tlm_nonblocking_peek_if<T> peek_if_type;
|
||||
|
||||
tlm_nonblocking_peek_port( const char *port_name ) :
|
||||
sc_core::sc_port< tlm_nonblocking_peek_if< T > , 1 >( port_name ) {}
|
||||
|
||||
sc_core::sc_event_finder& ok_to_peek() const {
|
||||
|
||||
return *new tlm_event_finder_t< peek_if_type , T >(
|
||||
*this,
|
||||
&peek_if_type::ok_to_peek );
|
||||
|
||||
}
|
||||
tlm_nonblocking_peek_port(const char *port_name) :
|
||||
sc_core::sc_port<tlm_nonblocking_peek_if<T>, 1>(port_name)
|
||||
{}
|
||||
|
||||
sc_core::sc_event_finder &
|
||||
ok_to_peek() const
|
||||
{
|
||||
return *new tlm_event_finder_t<peek_if_type, T>(
|
||||
*this, &peek_if_type::ok_to_peek);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template < typename T >
|
||||
template <typename T>
|
||||
class tlm_nonblocking_put_port :
|
||||
public sc_core::sc_port< tlm_nonblocking_put_if< T > , 1 >
|
||||
public sc_core::sc_port<tlm_nonblocking_put_if<T>, 1>
|
||||
{
|
||||
public:
|
||||
typedef tlm_nonblocking_put_if<T> put_if_type;
|
||||
public:
|
||||
typedef tlm_nonblocking_put_if<T> put_if_type;
|
||||
|
||||
tlm_nonblocking_put_port( const char *port_name ) :
|
||||
sc_core::sc_port< tlm_nonblocking_put_if< T > , 1 >( port_name ) {}
|
||||
|
||||
sc_core::sc_event_finder& ok_to_put() const {
|
||||
|
||||
return *new tlm_event_finder_t< put_if_type , T >(
|
||||
*this,
|
||||
&put_if_type::ok_to_put );
|
||||
|
||||
}
|
||||
tlm_nonblocking_put_port(const char *port_name) :
|
||||
sc_core::sc_port<tlm_nonblocking_put_if<T>, 1>(port_name)
|
||||
{}
|
||||
|
||||
sc_core::sc_event_finder &
|
||||
ok_to_put() const
|
||||
{
|
||||
return *new tlm_event_finder_t<put_if_type, T>(
|
||||
*this, &put_if_type::ok_to_put);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif
|
||||
/*__SYSTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_PORTS_TLM_NONBLOCKING_PORT_H__*/
|
||||
|
||||
@@ -17,21 +17,21 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_REQ_RSP_H__
|
||||
#define __TLM_REQ_RSP_H__
|
||||
#ifndef __SYsTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_REQ_RSP_H__
|
||||
#define __SYsTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_REQ_RSP_H__
|
||||
|
||||
// The unannotated TLM interfaces
|
||||
// The unannotated TLM interfaces.
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_core_ifs.h"
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_1_interfaces/tlm_master_slave_ifs.h"
|
||||
|
||||
// The channels : tlm_fifo, tlm_transport_channel and tlm_req_rsp_channel
|
||||
// The channels : tlm_fifo, tlm_transport_channel and tlm_req_rsp_channel.
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_channels/tlm_req_rsp_channels/tlm_req_rsp_channels.h"
|
||||
|
||||
// Some non blocking ports to provide static sensitivity
|
||||
// Some non blocking ports to provide static sensitivity.
|
||||
|
||||
#include "tlm_core/tlm_1/tlm_req_rsp/tlm_ports/tlm_nonblocking_port.h"
|
||||
|
||||
|
||||
#endif /* __TLM_REQ_RSP_H__ */
|
||||
#endif /*__SYsTEMC_EXT_TLM_CORE_TLM_1_TLM_REQ_RSP_TLM_REQ_RSP_H__ */
|
||||
|
||||
@@ -17,11 +17,10 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_2_INTERFACES_H__
|
||||
#define __TLM_2_INTERFACES_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_INTERFACES_TLM_2_INTERFACES_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_INTERFACES_TLM_2_INTERFACES_H__
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_2_interfaces/tlm_dmi.h"
|
||||
#include "tlm_core/tlm_2/tlm_2_interfaces/tlm_fw_bw_ifs.h"
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_INTERFACES_TLM_2_INTERFACES_H__ */
|
||||
|
||||
@@ -17,98 +17,108 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_DMI_H__
|
||||
#define __TLM_DMI_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_2_INTERFACES_TLM_DMI_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_2_INTERFACES_TLM_DMI_H__
|
||||
|
||||
#include <systemc>
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
class tlm_dmi
|
||||
{
|
||||
public:
|
||||
// Enum for indicating the access granted to the initiator.
|
||||
// The initiator uses gp.m_command to indicate it intention (read/write)
|
||||
// The target is allowed to promote DMI_ACCESS_READ or DMI_ACCESS_WRITE
|
||||
// requests to dmi_access_read_write.
|
||||
|
||||
// Enum for indicating the access granted to the initiator.
|
||||
// The initiator uses gp.m_command to indicate it intention (read/write)
|
||||
// The target is allowed to promote DMI_ACCESS_READ or DMI_ACCESS_WRITE
|
||||
// requests to dmi_access_read_write.
|
||||
enum dmi_access_e {
|
||||
DMI_ACCESS_NONE = 0x00, // no access
|
||||
DMI_ACCESS_READ = 0x01, // read access
|
||||
DMI_ACCESS_WRITE = 0x02, // write access
|
||||
DMI_ACCESS_READ_WRITE = DMI_ACCESS_READ | DMI_ACCESS_WRITE
|
||||
// read/write access
|
||||
};
|
||||
|
||||
enum dmi_access_e
|
||||
{ DMI_ACCESS_NONE = 0x00 // no access
|
||||
, DMI_ACCESS_READ = 0x01 // read access
|
||||
, DMI_ACCESS_WRITE = 0x02 // write access
|
||||
, DMI_ACCESS_READ_WRITE = DMI_ACCESS_READ | DMI_ACCESS_WRITE // read/write access
|
||||
};
|
||||
|
||||
tlm_dmi (void)
|
||||
{
|
||||
init();
|
||||
}
|
||||
|
||||
void init (void)
|
||||
{
|
||||
m_dmi_ptr = 0x0;
|
||||
m_dmi_start_address = 0x0;
|
||||
m_dmi_end_address = (sc_dt::uint64)(-1);
|
||||
m_dmi_access = DMI_ACCESS_NONE;
|
||||
m_dmi_read_latency = sc_core::SC_ZERO_TIME;
|
||||
m_dmi_write_latency = sc_core::SC_ZERO_TIME;
|
||||
}
|
||||
|
||||
unsigned char* get_dmi_ptr (void) const {return m_dmi_ptr;}
|
||||
sc_dt::uint64 get_start_address (void) const {return m_dmi_start_address;}
|
||||
sc_dt::uint64 get_end_address (void) const {return m_dmi_end_address;}
|
||||
sc_core::sc_time get_read_latency (void) const {return m_dmi_read_latency;}
|
||||
sc_core::sc_time get_write_latency (void) const {return m_dmi_write_latency;}
|
||||
dmi_access_e get_granted_access (void) const {return m_dmi_access;}
|
||||
bool is_none_allowed (void) const {return m_dmi_access == DMI_ACCESS_NONE;}
|
||||
bool is_read_allowed (void) const {return (m_dmi_access & DMI_ACCESS_READ) == DMI_ACCESS_READ;}
|
||||
bool is_write_allowed (void) const {return (m_dmi_access & DMI_ACCESS_WRITE) == DMI_ACCESS_WRITE;}
|
||||
bool is_read_write_allowed (void) const {return (m_dmi_access & DMI_ACCESS_READ_WRITE) == DMI_ACCESS_READ_WRITE;}
|
||||
tlm_dmi() { init(); }
|
||||
|
||||
void set_dmi_ptr (unsigned char* p) {m_dmi_ptr = p;}
|
||||
void set_start_address (sc_dt::uint64 addr) {m_dmi_start_address = addr;}
|
||||
void set_end_address (sc_dt::uint64 addr) {m_dmi_end_address = addr;}
|
||||
void set_read_latency (sc_core::sc_time t) {m_dmi_read_latency = t;}
|
||||
void set_write_latency (sc_core::sc_time t) {m_dmi_write_latency = t;}
|
||||
void set_granted_access (dmi_access_e a) {m_dmi_access = a;}
|
||||
void allow_none (void) {m_dmi_access = DMI_ACCESS_NONE;}
|
||||
void allow_read (void) {m_dmi_access = DMI_ACCESS_READ;}
|
||||
void allow_write (void) {m_dmi_access = DMI_ACCESS_WRITE;}
|
||||
void allow_read_write (void) {m_dmi_access = DMI_ACCESS_READ_WRITE;}
|
||||
void
|
||||
init()
|
||||
{
|
||||
m_dmi_ptr = nullptr;
|
||||
m_dmi_start_address = 0x0;
|
||||
m_dmi_end_address = (sc_dt::uint64)(-1);
|
||||
m_dmi_access = DMI_ACCESS_NONE;
|
||||
m_dmi_read_latency = sc_core::SC_ZERO_TIME;
|
||||
m_dmi_write_latency = sc_core::SC_ZERO_TIME;
|
||||
}
|
||||
|
||||
unsigned char *get_dmi_ptr() const { return m_dmi_ptr; }
|
||||
sc_dt::uint64 get_start_address() const { return m_dmi_start_address; }
|
||||
sc_dt::uint64 get_end_address() const { return m_dmi_end_address; }
|
||||
sc_core::sc_time get_read_latency() const { return m_dmi_read_latency; }
|
||||
sc_core::sc_time get_write_latency() const { return m_dmi_write_latency; }
|
||||
dmi_access_e get_granted_access() const { return m_dmi_access; }
|
||||
bool is_none_allowed() const { return m_dmi_access == DMI_ACCESS_NONE; }
|
||||
bool
|
||||
is_read_allowed() const
|
||||
{
|
||||
return (m_dmi_access & DMI_ACCESS_READ) == DMI_ACCESS_READ;
|
||||
}
|
||||
bool
|
||||
is_write_allowed() const
|
||||
{
|
||||
return (m_dmi_access & DMI_ACCESS_WRITE) == DMI_ACCESS_WRITE;
|
||||
}
|
||||
bool
|
||||
is_read_write_allowed() const
|
||||
{
|
||||
return (m_dmi_access & DMI_ACCESS_READ_WRITE) == DMI_ACCESS_READ_WRITE;
|
||||
}
|
||||
|
||||
void set_dmi_ptr(unsigned char *p) { m_dmi_ptr = p; }
|
||||
void set_start_address(sc_dt::uint64 addr) { m_dmi_start_address = addr; }
|
||||
void set_end_address(sc_dt::uint64 addr) { m_dmi_end_address = addr; }
|
||||
void set_read_latency(sc_core::sc_time t) { m_dmi_read_latency = t; }
|
||||
void set_write_latency(sc_core::sc_time t) { m_dmi_write_latency = t; }
|
||||
void set_granted_access(dmi_access_e a) { m_dmi_access = a; }
|
||||
void allow_none() { m_dmi_access = DMI_ACCESS_NONE; }
|
||||
void allow_read() { m_dmi_access = DMI_ACCESS_READ; }
|
||||
void allow_write() { m_dmi_access = DMI_ACCESS_WRITE; }
|
||||
void allow_read_write() { m_dmi_access = DMI_ACCESS_READ_WRITE; }
|
||||
|
||||
private:
|
||||
// If the forward call is successful, the target returns the dmi_ptr,
|
||||
// which must point to the data element corresponding to the
|
||||
// dmi_start_address. The data is organized as a byte array with the
|
||||
// endianness of the target (endianness member of the tlm_dmi struct).
|
||||
|
||||
// If the forward call is successful, the target returns the dmi_ptr,
|
||||
// which must point to the data element corresponding to the
|
||||
// dmi_start_address. The data is organized as a byte array with the
|
||||
// endianness of the target (endianness member of the tlm_dmi struct).
|
||||
|
||||
unsigned char* m_dmi_ptr;
|
||||
|
||||
// The absolute start and end addresses of the DMI region. If the decoder
|
||||
// logic in the interconnect changes the address field e.g. by masking, the
|
||||
// interconnect is responsible to transform the relative address back to an
|
||||
// absolute address again.
|
||||
|
||||
sc_dt::uint64 m_dmi_start_address;
|
||||
sc_dt::uint64 m_dmi_end_address;
|
||||
unsigned char *m_dmi_ptr;
|
||||
|
||||
// Granted access
|
||||
|
||||
dmi_access_e m_dmi_access;
|
||||
// The absolute start and end addresses of the DMI region. If the decoder
|
||||
// logic in the interconnect changes the address field e.g. by masking, the
|
||||
// interconnect is responsible to transform the relative address back to an
|
||||
// absolute address again.
|
||||
|
||||
// These members define the latency of read/write transactions. The
|
||||
// initiator must initialize these members to zero before requesting a
|
||||
// dmi pointer, because both the interconnect as well as the target can
|
||||
// add to the total transaction latency.
|
||||
// Depending on the 'type' attribute only one, or both of these attributes
|
||||
// will be valid.
|
||||
|
||||
sc_core::sc_time m_dmi_read_latency;
|
||||
sc_core::sc_time m_dmi_write_latency;
|
||||
sc_dt::uint64 m_dmi_start_address;
|
||||
sc_dt::uint64 m_dmi_end_address;
|
||||
|
||||
// Granted access
|
||||
|
||||
dmi_access_e m_dmi_access;
|
||||
|
||||
// These members define the latency of read/write transactions. The
|
||||
// initiator must initialize these members to zero before requesting a
|
||||
// dmi pointer, because both the interconnect as well as the target can
|
||||
// add to the total transaction latency.
|
||||
// Depending on the 'type' attribute only one, or both of these attributes
|
||||
// will be valid.
|
||||
|
||||
sc_core::sc_time m_dmi_read_latency;
|
||||
sc_core::sc_time m_dmi_write_latency;
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif /* TLM_DMI_HEADER */
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_2_INTERFACES_TLM_DMI_H__ */
|
||||
|
||||
@@ -17,43 +17,43 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_FW_BW_IFS_H__
|
||||
#define __TLM_FW_BW_IFS_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_2_INTERFACES_TLM_FW_BW_IFS_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_2_INTERFACES_TLM_FW_BW_IFS_H__
|
||||
|
||||
#include <systemc>
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_generic_payload.h"
|
||||
#include "tlm_core/tlm_2/tlm_2_interfaces/tlm_dmi.h"
|
||||
|
||||
namespace tlm {
|
||||
#include "tlm_core/tlm_2/tlm_2_interfaces/tlm_dmi.h"
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_generic_payload.h"
|
||||
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
enum tlm_sync_enum { TLM_ACCEPTED, TLM_UPDATED, TLM_COMPLETED };
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Basic interfaces
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
template <typename TRANS = tlm_generic_payload,
|
||||
typename PHASE = tlm_phase>
|
||||
class tlm_fw_nonblocking_transport_if : public virtual sc_core::sc_interface {
|
||||
public:
|
||||
virtual tlm_sync_enum nb_transport_fw(TRANS& trans,
|
||||
PHASE& phase,
|
||||
sc_core::sc_time& t) = 0;
|
||||
template <typename TRANS=tlm_generic_payload, typename PHASE=tlm_phase>
|
||||
class tlm_fw_nonblocking_transport_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual tlm_sync_enum nb_transport_fw(TRANS &trans, PHASE &phase,
|
||||
sc_core::sc_time& t) = 0;
|
||||
};
|
||||
|
||||
template <typename TRANS = tlm_generic_payload,
|
||||
typename PHASE = tlm_phase>
|
||||
class tlm_bw_nonblocking_transport_if : public virtual sc_core::sc_interface {
|
||||
public:
|
||||
virtual tlm_sync_enum nb_transport_bw(TRANS& trans,
|
||||
PHASE& phase,
|
||||
sc_core::sc_time& t) = 0;
|
||||
template <typename TRANS=tlm_generic_payload, typename PHASE=tlm_phase>
|
||||
class tlm_bw_nonblocking_transport_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual tlm_sync_enum nb_transport_bw(TRANS &trans, PHASE &phase,
|
||||
sc_core::sc_time &t) = 0;
|
||||
};
|
||||
|
||||
template <typename TRANS = tlm_generic_payload>
|
||||
class tlm_blocking_transport_if : public virtual sc_core::sc_interface {
|
||||
public:
|
||||
virtual void b_transport(TRANS& trans,
|
||||
sc_core::sc_time& t) = 0;
|
||||
template <typename TRANS=tlm_generic_payload>
|
||||
class tlm_blocking_transport_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual void b_transport(TRANS &trans, sc_core::sc_time &t) = 0;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@@ -115,12 +115,11 @@ public:
|
||||
// required to set the DMI hint to true if a DMI request on the given address
|
||||
// with the given transaction type (read or write) would have succeeded.
|
||||
|
||||
template <typename TRANS = tlm_generic_payload>
|
||||
template <typename TRANS=tlm_generic_payload>
|
||||
class tlm_fw_direct_mem_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual bool get_direct_mem_ptr(TRANS& trans,
|
||||
tlm_dmi& dmi_data) = 0;
|
||||
public:
|
||||
virtual bool get_direct_mem_ptr(TRANS &trans, tlm_dmi &dmi_data) = 0;
|
||||
};
|
||||
|
||||
// The semantics of the backwards call is as follows:
|
||||
@@ -152,9 +151,9 @@ public:
|
||||
//
|
||||
class tlm_bw_direct_mem_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
virtual void invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
|
||||
sc_dt::uint64 end_range) = 0;
|
||||
public:
|
||||
virtual void invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
|
||||
sc_dt::uint64 end_range) = 0;
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
@@ -181,13 +180,13 @@ public:
|
||||
// this number must be <= num_bytes. Thus, a target can safely return 0 if it
|
||||
// does not support debug transactions.
|
||||
//
|
||||
template <typename TRANS = tlm_generic_payload>
|
||||
template <typename TRANS=tlm_generic_payload>
|
||||
class tlm_transport_dbg_if : public virtual sc_core::sc_interface
|
||||
{
|
||||
public:
|
||||
// The return value of defines the number of bytes successfully
|
||||
// transferred.
|
||||
virtual unsigned int transport_dbg(TRANS& trans) = 0;
|
||||
public:
|
||||
// The return value of defines the number of bytes successfully
|
||||
// transferred.
|
||||
virtual unsigned int transport_dbg(TRANS &trans) = 0;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
@@ -196,28 +195,28 @@ public:
|
||||
|
||||
struct tlm_base_protocol_types
|
||||
{
|
||||
typedef tlm_generic_payload tlm_payload_type;
|
||||
typedef tlm_phase tlm_phase_type;
|
||||
typedef tlm_generic_payload tlm_payload_type;
|
||||
typedef tlm_phase tlm_phase_type;
|
||||
};
|
||||
|
||||
// The forward interface:
|
||||
template <typename TYPES = tlm_base_protocol_types>
|
||||
class tlm_fw_transport_if
|
||||
: public virtual tlm_fw_nonblocking_transport_if<typename TYPES::tlm_payload_type,
|
||||
typename TYPES::tlm_phase_type>
|
||||
, public virtual tlm_blocking_transport_if<typename TYPES::tlm_payload_type>
|
||||
, public virtual tlm_fw_direct_mem_if<typename TYPES::tlm_payload_type>
|
||||
, public virtual tlm_transport_dbg_if<typename TYPES::tlm_payload_type>
|
||||
template <typename TYPES=tlm_base_protocol_types>
|
||||
class tlm_fw_transport_if :
|
||||
public virtual tlm_fw_nonblocking_transport_if<
|
||||
typename TYPES::tlm_payload_type, typename TYPES::tlm_phase_type>,
|
||||
public virtual tlm_blocking_transport_if<typename TYPES::tlm_payload_type>,
|
||||
public virtual tlm_fw_direct_mem_if<typename TYPES::tlm_payload_type>,
|
||||
public virtual tlm_transport_dbg_if<typename TYPES::tlm_payload_type>
|
||||
{};
|
||||
|
||||
// The backward interface:
|
||||
template <typename TYPES = tlm_base_protocol_types>
|
||||
class tlm_bw_transport_if
|
||||
: public virtual tlm_bw_nonblocking_transport_if<typename TYPES::tlm_payload_type,
|
||||
typename TYPES::tlm_phase_type>
|
||||
, public virtual tlm_bw_direct_mem_if
|
||||
template <typename TYPES=tlm_base_protocol_types>
|
||||
class tlm_bw_transport_if :
|
||||
public virtual tlm_bw_nonblocking_transport_if<
|
||||
typename TYPES::tlm_payload_type, typename TYPES::tlm_phase_type>,
|
||||
public virtual tlm_bw_direct_mem_if
|
||||
{};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif /* __TLM_FW_BW_IFS_H__ */
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_2_INTERFACES_TLM_FW_BW_IFS_H__ */
|
||||
|
||||
@@ -17,23 +17,13 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_CORE_TLM2_TLM_ARRAY_H_INCLUDED_
|
||||
#define TLM_CORE_TLM2_TLM_ARRAY_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOADS_TLM_ARRAY_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOADS_TLM_ARRAY_H__
|
||||
|
||||
#include <vector>
|
||||
|
||||
#if defined(_MSC_VER) && !defined(SC_WIN_DLL_WARN)
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4251) // DLL import for std::string,vector
|
||||
#endif
|
||||
|
||||
namespace tlm {
|
||||
|
||||
//
|
||||
// To the LRM writer: the below class is an artifact of the tlm_generic_payload
|
||||
// implementation and not part of the core TLM standard
|
||||
//
|
||||
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
// This implements a lean and fast array class that supports array expansion on
|
||||
// request. The class is primarily used in the tlm_generic_payload class for
|
||||
@@ -48,79 +38,61 @@ namespace tlm {
|
||||
// may invalidate all direct pointers into the array.
|
||||
|
||||
|
||||
//the tlm_array shall always be used with T=tlm_extension_base*
|
||||
// The tlm_array shall always be used with T=tlm_extension_base*.
|
||||
template <typename T>
|
||||
class tlm_array
|
||||
: private std::vector<T>
|
||||
class tlm_array : private std::vector<T>
|
||||
{
|
||||
typedef std::vector<T> base_type;
|
||||
private:
|
||||
typedef std::vector<T> base_type;
|
||||
typedef typename base_type::size_type size_type;
|
||||
public:
|
||||
|
||||
// constructor:
|
||||
tlm_array(size_type size = 0)
|
||||
: base_type(size)
|
||||
, m_entries()
|
||||
{
|
||||
//m_entries.reserve(size); // optional
|
||||
}
|
||||
public:
|
||||
tlm_array(size_type size=0) : base_type(size), m_entries() {}
|
||||
|
||||
// copy constructor:
|
||||
// tlm_array(const tlm_array& orig) = default;
|
||||
// Operators for dereferencing:
|
||||
using base_type::operator [];
|
||||
|
||||
// destructor:
|
||||
// ~tlm_array() = default;
|
||||
|
||||
// operators for dereferencing:
|
||||
using base_type::operator[];
|
||||
|
||||
// array size:
|
||||
// Array size:
|
||||
using base_type::size;
|
||||
|
||||
// expand the array if needed:
|
||||
void expand(size_type new_size)
|
||||
// Expand the array if needed:
|
||||
void
|
||||
expand(size_type new_size)
|
||||
{
|
||||
if (new_size > size())
|
||||
{
|
||||
base_type::resize(new_size);
|
||||
//m_entries.reserve(new_size); // optional
|
||||
}
|
||||
}
|
||||
|
||||
static const char* const kind_string;
|
||||
const char* kind() const { return kind_string; }
|
||||
static const char *const kind_string;
|
||||
const char *kind() const { return kind_string; }
|
||||
|
||||
//this function shall get a pointer to a array slot
|
||||
// This function shall get a pointer to an array slot
|
||||
// it stores this slot in a cache of active slots
|
||||
void insert_in_cache(T* p)
|
||||
{
|
||||
//sc_assert( (p-&(*this)[0]) < size() );
|
||||
m_entries.push_back( p-&(*this)[0] );
|
||||
}
|
||||
void insert_in_cache(T *p) { m_entries.push_back(p - &(*this)[0]); }
|
||||
|
||||
//this functions clears all active slots of the array
|
||||
void free_entire_cache()
|
||||
// This functions clears all active slots of the array.
|
||||
void
|
||||
free_entire_cache()
|
||||
{
|
||||
while(m_entries.size())
|
||||
{
|
||||
if ((*this)[m_entries.back()]) //we make sure no one cleared the slot manually
|
||||
(*this)[m_entries.back()]->free();//...and then we call free on the content of the slot
|
||||
(*this)[m_entries.back()]=0; //afterwards we set the slot to NULL
|
||||
while (m_entries.size()) {
|
||||
// We make sure no one cleared the slot manually.
|
||||
if ((*this)[m_entries.back()]) {
|
||||
// ...and then we call free on the content of the slot
|
||||
(*this)[m_entries.back()]->free();
|
||||
}
|
||||
// Afterwards we set the slot to NULL
|
||||
(*this)[m_entries.back()] = nullptr;
|
||||
m_entries.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
protected:
|
||||
std::vector<size_type> m_entries;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
const char* const tlm_array<T>::kind_string = "tlm_array";
|
||||
|
||||
#if defined(_MSC_VER) && !defined(SC_WIN_DLL_WARN)
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
const char *const tlm_array<T>::kind_string = "tlm_array";
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif /* TLM_CORE_TLM2_TLM_ARRAY_H_INCLUDED_ */
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOADS_TLM_ARRAY_H__ */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -17,13 +17,12 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_GENERIC_PAYLOAD_H__
|
||||
#define __TLM_GENERIC_PAYLOAD_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_TLM_GENERIC_PAYLOAD_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_TLM_GENERIC_PAYLOAD_H__
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_endian_conv.h"
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_gp.h"
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_helpers.h"
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_phase.h"
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_gp.h"
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_endian_conv.h"
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_TLM_GENERIC_PAYLOAD_H__ */
|
||||
|
||||
@@ -17,51 +17,43 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
// 12-Jan-2009 John Aynsley Bug fix. has_mm() and get_ref_count() should both be const
|
||||
// 23-Mar-2009 John Aynsley Add method update_original_from()
|
||||
// 20-Apr-2009 John Aynsley Bug fix for 64-bit machines: unsigned long int -> unsigned int
|
||||
// 5-May-2011 JA and Philipp Hartmann Add tlm_gp_option, set_gp_option, get_gp_option
|
||||
// 11-May-2011 John Aynsley Add run-time check to release()
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOAD_TLM_GP_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOAD_TLM_GP_H__
|
||||
|
||||
|
||||
#ifndef TLM_CORE_TLM2_TLM_GP_H_INCLUDED_
|
||||
#define TLM_CORE_TLM2_TLM_GP_H_INCLUDED_
|
||||
|
||||
#include "sysc/kernel/sc_cmnhdr.h" // SC_API
|
||||
#include "sysc/utils/sc_report.h" // sc_assert
|
||||
#include "sysc/datatypes/int/sc_nbdefs.h" // sc_dt::uint64
|
||||
#include <systemc>
|
||||
#include <typeinfo> // std::type_info
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_array.h"
|
||||
|
||||
#include <typeinfo> // std::type_info
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
class tlm_generic_payload;
|
||||
|
||||
class tlm_mm_interface {
|
||||
public:
|
||||
virtual void free(tlm_generic_payload*) = 0;
|
||||
virtual ~tlm_mm_interface() {}
|
||||
class tlm_mm_interface
|
||||
{
|
||||
public:
|
||||
virtual void free(tlm_generic_payload *) = 0;
|
||||
virtual ~tlm_mm_interface() {}
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Classes and helpers for the extension mechanism
|
||||
//---------------------------------------------------------------------------
|
||||
// Helper function:
|
||||
SC_API unsigned int max_num_extensions();
|
||||
unsigned int max_num_extensions();
|
||||
|
||||
// This class can be used for storing pointers to the extension classes, used
|
||||
// in tlm_generic_payload:
|
||||
class SC_API tlm_extension_base
|
||||
class tlm_extension_base
|
||||
{
|
||||
public:
|
||||
virtual tlm_extension_base* clone() const = 0;
|
||||
public:
|
||||
virtual tlm_extension_base *clone() const = 0;
|
||||
virtual void free() { delete this; }
|
||||
virtual void copy_from(tlm_extension_base const &) = 0;
|
||||
protected:
|
||||
protected:
|
||||
virtual ~tlm_extension_base() {}
|
||||
static unsigned int register_extension(const std::type_info&);
|
||||
static unsigned int register_extension(const std::type_info &);
|
||||
};
|
||||
|
||||
// Base class for all extension classes, derive your extension class in
|
||||
@@ -73,27 +65,29 @@ protected:
|
||||
template <typename T>
|
||||
class tlm_extension : public tlm_extension_base
|
||||
{
|
||||
public:
|
||||
virtual tlm_extension_base* clone() const = 0;
|
||||
public:
|
||||
virtual tlm_extension_base *clone() const = 0;
|
||||
virtual void copy_from(tlm_extension_base const &ext) = 0;
|
||||
virtual ~tlm_extension() {}
|
||||
const static unsigned int ID;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
const unsigned int tlm_extension<T>::ID
|
||||
= tlm_extension_base::register_extension(typeid(T));
|
||||
const unsigned int tlm_extension<T>::ID =
|
||||
tlm_extension_base::register_extension(typeid(T));
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// enumeration types
|
||||
//---------------------------------------------------------------------------
|
||||
enum tlm_command {
|
||||
enum tlm_command
|
||||
{
|
||||
TLM_READ_COMMAND,
|
||||
TLM_WRITE_COMMAND,
|
||||
TLM_IGNORE_COMMAND
|
||||
};
|
||||
|
||||
enum tlm_response_status {
|
||||
enum tlm_response_status
|
||||
{
|
||||
TLM_OK_RESPONSE = 1,
|
||||
TLM_INCOMPLETE_RESPONSE = 0,
|
||||
TLM_GENERIC_ERROR_RESPONSE = -1,
|
||||
@@ -103,7 +97,8 @@ enum tlm_response_status {
|
||||
TLM_BYTE_ENABLE_ERROR_RESPONSE = -5
|
||||
};
|
||||
|
||||
enum tlm_gp_option {
|
||||
enum tlm_gp_option
|
||||
{
|
||||
TLM_MIN_PAYLOAD,
|
||||
TLM_FULL_PAYLOAD,
|
||||
TLM_FULL_PAYLOAD_ACCEPTED
|
||||
@@ -116,115 +111,146 @@ enum tlm_gp_option {
|
||||
// The generic payload class:
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
SC_API_TEMPLATE_DECL_ tlm_array<tlm_extension_base*>;
|
||||
extern template class tlm_array<tlm_extension_base *>;
|
||||
|
||||
class SC_API tlm_generic_payload {
|
||||
|
||||
public:
|
||||
//---------------
|
||||
// Constructors
|
||||
//---------------
|
||||
|
||||
// Default constructor
|
||||
class tlm_generic_payload
|
||||
{
|
||||
public:
|
||||
tlm_generic_payload();
|
||||
explicit tlm_generic_payload(tlm_mm_interface* mm);
|
||||
explicit tlm_generic_payload(tlm_mm_interface *mm);
|
||||
|
||||
void acquire() { sc_assert(m_mm != 0); m_ref_count++; }
|
||||
void
|
||||
acquire()
|
||||
{
|
||||
sc_assert(m_mm != 0);
|
||||
m_ref_count++;
|
||||
}
|
||||
|
||||
void release() {
|
||||
void
|
||||
release()
|
||||
{
|
||||
sc_assert(m_mm != 0 && m_ref_count > 0);
|
||||
if (--m_ref_count==0)
|
||||
if (--m_ref_count == 0)
|
||||
m_mm->free(this);
|
||||
}
|
||||
|
||||
int get_ref_count() const { return m_ref_count; }
|
||||
|
||||
void set_mm(tlm_mm_interface* mm) { m_mm = mm; }
|
||||
void set_mm(tlm_mm_interface *mm) { m_mm = mm; }
|
||||
bool has_mm() const { return m_mm != 0; }
|
||||
|
||||
void reset();
|
||||
|
||||
private:
|
||||
//disabled copy ctor and assignment operator.
|
||||
tlm_generic_payload(const tlm_generic_payload& x) /* = delete */;
|
||||
tlm_generic_payload& operator= (const tlm_generic_payload& x) /* = delete */;
|
||||
private:
|
||||
// Disabled copy ctor and assignment operator.
|
||||
tlm_generic_payload(const tlm_generic_payload &x);
|
||||
tlm_generic_payload &operator = (const tlm_generic_payload &x);
|
||||
|
||||
public:
|
||||
// non-virtual deep-copying of the object
|
||||
void deep_copy_from(const tlm_generic_payload & other);
|
||||
public:
|
||||
// Non-virtual deep-copying of the object.
|
||||
void deep_copy_from(const tlm_generic_payload &other);
|
||||
|
||||
// To update the state of the original generic payload from a deep copy
|
||||
// Assumes that "other" was created from the original by calling deep_copy_from
|
||||
// Argument use_byte_enable_on_read determines whether to use or ignores byte enables
|
||||
// when copying back the data array on a read command
|
||||
// To update the state of the original generic payload from a deep copy.
|
||||
// Assumes that "other" was created from the original by calling
|
||||
// deep_copy_from Argument use_byte_enable_on_read determines whether to
|
||||
// use or ignores byte enables when copying back the data array on a read
|
||||
// command.
|
||||
|
||||
void update_original_from(const tlm_generic_payload & other,
|
||||
bool use_byte_enable_on_read = true);
|
||||
void update_original_from(const tlm_generic_payload &other,
|
||||
bool use_byte_enable_on_read=true);
|
||||
|
||||
void update_extensions_from(const tlm_generic_payload & other);
|
||||
void update_extensions_from(const tlm_generic_payload &other);
|
||||
|
||||
// Free all extensions. Useful when reusing a cloned transaction that doesn't have memory manager.
|
||||
// normal and sticky extensions are freed and extension array cleared.
|
||||
// Free all extensions. Useful when reusing a cloned transaction that
|
||||
// doesn't have memory manager. Normal and sticky extensions are freed and
|
||||
// extension array cleared.
|
||||
void free_all_extensions();
|
||||
|
||||
//--------------
|
||||
// Destructor
|
||||
//--------------
|
||||
virtual ~tlm_generic_payload();
|
||||
|
||||
//----------------
|
||||
// API (including setters & getters)
|
||||
// API (including setters & getters).
|
||||
//---------------
|
||||
|
||||
// Command related method
|
||||
bool is_read() const {return (m_command == TLM_READ_COMMAND);}
|
||||
void set_read() {m_command = TLM_READ_COMMAND;}
|
||||
bool is_write() const {return (m_command == TLM_WRITE_COMMAND);}
|
||||
void set_write() {m_command = TLM_WRITE_COMMAND;}
|
||||
tlm_command get_command() const {return m_command;}
|
||||
void set_command(const tlm_command command) {m_command = command;}
|
||||
// Command related method.
|
||||
bool is_read() const { return (m_command == TLM_READ_COMMAND); }
|
||||
void set_read() { m_command = TLM_READ_COMMAND; }
|
||||
bool is_write() const { return (m_command == TLM_WRITE_COMMAND); }
|
||||
void set_write() { m_command = TLM_WRITE_COMMAND; }
|
||||
tlm_command get_command() const { return m_command; }
|
||||
void set_command(const tlm_command command) { m_command = command; }
|
||||
|
||||
// Address related methods
|
||||
sc_dt::uint64 get_address() const {return m_address;}
|
||||
void set_address(const sc_dt::uint64 address) {m_address = address;}
|
||||
// Address related methods.
|
||||
sc_dt::uint64 get_address() const { return m_address; }
|
||||
void set_address(const sc_dt::uint64 address) { m_address = address; }
|
||||
|
||||
// Data related methods
|
||||
unsigned char* get_data_ptr() const {return m_data;}
|
||||
void set_data_ptr(unsigned char* data) {m_data = data;}
|
||||
// Data related methods.
|
||||
unsigned char *get_data_ptr() const { return m_data; }
|
||||
void set_data_ptr(unsigned char *data) { m_data = data; }
|
||||
|
||||
// Transaction length (in bytes) related methods
|
||||
unsigned int get_data_length() const {return m_length;}
|
||||
void set_data_length(const unsigned int length) {m_length = length;}
|
||||
// Transaction length (in bytes) related methods.
|
||||
unsigned int get_data_length() const { return m_length; }
|
||||
void set_data_length(const unsigned int length) { m_length = length; }
|
||||
|
||||
// Response status related methods
|
||||
bool is_response_ok() const {return (m_response_status > 0);}
|
||||
bool is_response_error() const {return (m_response_status <= 0);}
|
||||
tlm_response_status get_response_status() const {return m_response_status;}
|
||||
void set_response_status(const tlm_response_status response_status)
|
||||
{m_response_status = response_status;}
|
||||
std::string get_response_string() const;
|
||||
// Response status related methods.
|
||||
bool is_response_ok() const { return (m_response_status > 0); }
|
||||
bool is_response_error() const { return (m_response_status <= 0); }
|
||||
tlm_response_status
|
||||
get_response_status() const
|
||||
{
|
||||
return m_response_status;
|
||||
}
|
||||
void
|
||||
set_response_status(const tlm_response_status response_status)
|
||||
{
|
||||
m_response_status = response_status;
|
||||
}
|
||||
std::string get_response_string() const;
|
||||
|
||||
// Streaming related methods
|
||||
unsigned int get_streaming_width() const {return m_streaming_width;}
|
||||
void set_streaming_width(const unsigned int streaming_width) {m_streaming_width = streaming_width; }
|
||||
// Streaming related methods.
|
||||
unsigned int get_streaming_width() const { return m_streaming_width; }
|
||||
void
|
||||
set_streaming_width(const unsigned int streaming_width)
|
||||
{
|
||||
m_streaming_width = streaming_width;
|
||||
}
|
||||
|
||||
// Byte enable related methods
|
||||
unsigned char* get_byte_enable_ptr() const {return m_byte_enable;}
|
||||
void set_byte_enable_ptr(unsigned char* byte_enable){m_byte_enable = byte_enable;}
|
||||
unsigned int get_byte_enable_length() const {return m_byte_enable_length;}
|
||||
void set_byte_enable_length(const unsigned int byte_enable_length){m_byte_enable_length = byte_enable_length;}
|
||||
// Byte enable related methods.
|
||||
unsigned char *get_byte_enable_ptr() const { return m_byte_enable; }
|
||||
void
|
||||
set_byte_enable_ptr(unsigned char *byte_enable)
|
||||
{
|
||||
m_byte_enable = byte_enable;
|
||||
}
|
||||
unsigned int
|
||||
get_byte_enable_length() const
|
||||
{
|
||||
return m_byte_enable_length;
|
||||
}
|
||||
void
|
||||
set_byte_enable_length(const unsigned int byte_enable_length)
|
||||
{
|
||||
m_byte_enable_length = byte_enable_length;
|
||||
}
|
||||
|
||||
// This is the "DMI-hint" a slave can set this to true if it
|
||||
// wants to indicate that a DMI request would be supported:
|
||||
void set_dmi_allowed(bool dmi_allowed) { m_dmi = dmi_allowed; }
|
||||
bool is_dmi_allowed() const { return m_dmi; }
|
||||
void
|
||||
set_dmi_allowed(bool dmi_allowed)
|
||||
{
|
||||
m_dmi = dmi_allowed;
|
||||
}
|
||||
bool
|
||||
is_dmi_allowed() const
|
||||
{
|
||||
return m_dmi;
|
||||
}
|
||||
|
||||
// Use full set of attributes in DMI/debug?
|
||||
tlm_gp_option get_gp_option() const { return m_gp_option; }
|
||||
void set_gp_option( const tlm_gp_option gp_opt ) { m_gp_option = gp_opt; }
|
||||
|
||||
private:
|
||||
void set_gp_option(const tlm_gp_option gp_opt) { m_gp_option = gp_opt; }
|
||||
|
||||
private:
|
||||
/* --------------------------------------------------------------------- */
|
||||
/* Generic Payload attributes: */
|
||||
/* --------------------------------------------------------------------- */
|
||||
@@ -260,19 +286,18 @@ private:
|
||||
/* - m_streaming_width : */
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
sc_dt::uint64 m_address;
|
||||
tlm_command m_command;
|
||||
unsigned char* m_data;
|
||||
unsigned int m_length;
|
||||
tlm_response_status m_response_status;
|
||||
bool m_dmi;
|
||||
unsigned char* m_byte_enable;
|
||||
unsigned int m_byte_enable_length;
|
||||
unsigned int m_streaming_width;
|
||||
tlm_gp_option m_gp_option;
|
||||
|
||||
public:
|
||||
sc_dt::uint64 m_address;
|
||||
tlm_command m_command;
|
||||
unsigned char *m_data;
|
||||
unsigned int m_length;
|
||||
tlm_response_status m_response_status;
|
||||
bool m_dmi;
|
||||
unsigned char *m_byte_enable;
|
||||
unsigned int m_byte_enable_length;
|
||||
unsigned int m_streaming_width;
|
||||
tlm_gp_option m_gp_option;
|
||||
|
||||
public:
|
||||
/* --------------------------------------------------------------------- */
|
||||
/* Dynamic extension mechanism: */
|
||||
/* --------------------------------------------------------------------- */
|
||||
@@ -310,79 +335,81 @@ public:
|
||||
|
||||
// Stick the pointer to an extension into the vector, return the
|
||||
// previous value:
|
||||
template <typename T> T* set_extension(T* ext)
|
||||
template <typename T>
|
||||
T *
|
||||
set_extension(T *ext)
|
||||
{
|
||||
return static_cast<T*>(set_extension(T::ID, ext));
|
||||
return static_cast<T *>(set_extension(T::ID, ext));
|
||||
}
|
||||
|
||||
// non-templatized version with manual index:
|
||||
tlm_extension_base* set_extension(unsigned int index,
|
||||
tlm_extension_base* ext);
|
||||
// Non-templatized version with manual index:
|
||||
tlm_extension_base *set_extension(
|
||||
unsigned int index, tlm_extension_base *ext);
|
||||
|
||||
// Stick the pointer to an extension into the vector, return the
|
||||
// previous value and schedule its release
|
||||
template <typename T> T* set_auto_extension(T* ext)
|
||||
// previous value and schedule its release.
|
||||
template <typename T>
|
||||
T *
|
||||
set_auto_extension(T *ext)
|
||||
{
|
||||
return static_cast<T*>(set_auto_extension(T::ID, ext));
|
||||
return static_cast<T *>(set_auto_extension(T::ID, ext));
|
||||
}
|
||||
|
||||
// non-templatized version with manual index:
|
||||
tlm_extension_base* set_auto_extension(unsigned int index,
|
||||
tlm_extension_base* ext);
|
||||
// Non-templatized version with manual index:
|
||||
tlm_extension_base *set_auto_extension(
|
||||
unsigned int index, tlm_extension_base *ext);
|
||||
|
||||
// Check for an extension, ext will point to 0 if not present
|
||||
template <typename T> void get_extension(T*& ext) const
|
||||
{
|
||||
ext = get_extension<T>();
|
||||
}
|
||||
template <typename T> T* get_extension() const
|
||||
// Check for an extension, ext will point to 0 if not present.
|
||||
template <typename T>
|
||||
void get_extension(T *& ext) const { ext = get_extension<T>(); }
|
||||
template <typename T>
|
||||
T *
|
||||
get_extension() const
|
||||
{
|
||||
return static_cast<T*>(get_extension(T::ID));
|
||||
}
|
||||
// Non-templatized version with manual index:
|
||||
tlm_extension_base* get_extension(unsigned int index) const;
|
||||
tlm_extension_base *get_extension(unsigned int index) const;
|
||||
|
||||
//this call just removes the extension from the txn but does not
|
||||
// call free() or tells the MM to do so
|
||||
// it return false if there was active MM so you are now in an unsafe situation
|
||||
// recommended use: when 100% sure there is no MM
|
||||
template <typename T> void clear_extension(const T* ext)
|
||||
{
|
||||
clear_extension<T>();
|
||||
}
|
||||
// This call just removes the extension from the txn but does not
|
||||
// call free() or tells the MM to do so it return false if there was
|
||||
// active MM so you are now in an unsafe situation recommended use:
|
||||
// when 100% sure there is no MM.
|
||||
template <typename T>
|
||||
void clear_extension(const T *ext) { clear_extension<T>(); }
|
||||
|
||||
//this call just removes the extension from the txn but does not
|
||||
// call free() or tells the MM to do so
|
||||
// it return false if there was active MM so you are now in an unsafe situation
|
||||
// recommended use: when 100% sure there is no MM
|
||||
template <typename T> void clear_extension()
|
||||
{
|
||||
clear_extension(T::ID);
|
||||
}
|
||||
// This call just removes the extension from the txn but does not
|
||||
// call free() or tells the MM to do so it return false if there was
|
||||
// active MM so you are now in an unsafe situation recommended use: when
|
||||
// 100% sure there is no MM.
|
||||
template <typename T>
|
||||
void clear_extension() { clear_extension(T::ID); }
|
||||
|
||||
//this call removes the extension from the txn and does
|
||||
// call free() or tells the MM to do so when the txn is finally done
|
||||
// recommended use: when not sure there is no MM
|
||||
template <typename T> void release_extension(T* ext)
|
||||
// This call removes the extension from the txn and does call free() or
|
||||
// tells the MM to do so when the txn is finally done recommended use:
|
||||
// when not sure there is no MM.
|
||||
template <typename T>
|
||||
void release_extension(T *ext)
|
||||
{
|
||||
release_extension<T>();
|
||||
}
|
||||
|
||||
//this call removes the extension from the txn and does
|
||||
// call free() or tells the MM to do so when the txn is finally done
|
||||
// recommended use: when not sure there is no MM
|
||||
template <typename T> void release_extension()
|
||||
// This call removes the extension from the txn and does call free() or
|
||||
// tells the MM to do so when the txn is finally done recommended use:
|
||||
// when not sure there is no MM
|
||||
template <typename T>
|
||||
void release_extension()
|
||||
{
|
||||
release_extension(T::ID);
|
||||
}
|
||||
|
||||
private:
|
||||
private:
|
||||
// Non-templatized version with manual index
|
||||
void clear_extension(unsigned int index);
|
||||
// Non-templatized version with manual index
|
||||
void release_extension(unsigned int index);
|
||||
|
||||
public:
|
||||
public:
|
||||
// Make sure the extension array is large enough. Can be called once by
|
||||
// an initiator module (before issuing the first transaction) to make
|
||||
// sure that the extension array is of correct size. This is only needed
|
||||
@@ -390,13 +417,12 @@ public:
|
||||
// allocated after C++ static construction time.
|
||||
void resize_extensions();
|
||||
|
||||
private:
|
||||
tlm_array<tlm_extension_base*> m_extensions;
|
||||
tlm_mm_interface* m_mm;
|
||||
unsigned int m_ref_count;
|
||||
private:
|
||||
tlm_array<tlm_extension_base *> m_extensions;
|
||||
tlm_mm_interface *m_mm;
|
||||
unsigned int m_ref_count;
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
|
||||
#endif /* TLM_CORE_TLM2_TLM_GP_H_INCLUDED_ */
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOAD_TLM_GP_H__ */
|
||||
|
||||
@@ -17,64 +17,54 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
/* ---------------------------------------------------------------------------------------
|
||||
@file tlm_helpers.h
|
||||
|
||||
@brief
|
||||
|
||||
Original Authors:
|
||||
Charles Wilson, ESLX
|
||||
|
||||
--------------------------------------------------------------------------------------- */
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOAD_TLM_HELPERS_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOAD_TLM_HELPERS_H__
|
||||
|
||||
#ifndef __TLM_HELPERS_H__
|
||||
#define __TLM_HELPERS_H__
|
||||
|
||||
//#include <sys/param.h>
|
||||
//#include <cstring>
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
enum tlm_endianness { TLM_UNKNOWN_ENDIAN, TLM_LITTLE_ENDIAN, TLM_BIG_ENDIAN };
|
||||
|
||||
inline tlm_endianness get_host_endianness(void)
|
||||
inline tlm_endianness
|
||||
get_host_endianness()
|
||||
{
|
||||
static tlm_endianness host_endianness = TLM_UNKNOWN_ENDIAN;
|
||||
|
||||
if (host_endianness == TLM_UNKNOWN_ENDIAN) {
|
||||
unsigned int number = 1;
|
||||
unsigned char *p_msb_or_lsb = (unsigned char*)&number;
|
||||
static tlm_endianness host_endianness = TLM_UNKNOWN_ENDIAN;
|
||||
|
||||
host_endianness = (p_msb_or_lsb[0] == 0) ? TLM_BIG_ENDIAN : TLM_LITTLE_ENDIAN;
|
||||
}
|
||||
return host_endianness;
|
||||
if (host_endianness == TLM_UNKNOWN_ENDIAN) {
|
||||
unsigned int number = 1;
|
||||
unsigned char *p_msb_or_lsb = (unsigned char *)&number;
|
||||
host_endianness = (p_msb_or_lsb[0] == 0) ?
|
||||
TLM_BIG_ENDIAN : TLM_LITTLE_ENDIAN;
|
||||
}
|
||||
return host_endianness;
|
||||
}
|
||||
|
||||
inline bool host_has_little_endianness(void)
|
||||
inline bool
|
||||
host_has_little_endianness()
|
||||
{
|
||||
static tlm_endianness host_endianness = TLM_UNKNOWN_ENDIAN;
|
||||
static bool host_little_endian = false;
|
||||
|
||||
if (host_endianness == TLM_UNKNOWN_ENDIAN) {
|
||||
unsigned int number = 1;
|
||||
unsigned char *p_msb_or_lsb = (unsigned char*)&number;
|
||||
static tlm_endianness host_endianness = TLM_UNKNOWN_ENDIAN;
|
||||
static bool host_little_endian = false;
|
||||
|
||||
host_little_endian = (p_msb_or_lsb[0] == 0) ? false : true;
|
||||
}
|
||||
if (host_endianness == TLM_UNKNOWN_ENDIAN) {
|
||||
unsigned int number = 1;
|
||||
unsigned char *p_msb_or_lsb = (unsigned char *)&number;
|
||||
|
||||
return host_little_endian;
|
||||
host_little_endian = (p_msb_or_lsb[0] == 0) ? false : true;
|
||||
}
|
||||
|
||||
return host_little_endian;
|
||||
}
|
||||
|
||||
inline bool has_host_endianness(tlm_endianness endianness)
|
||||
inline bool
|
||||
has_host_endianness(tlm_endianness endianness)
|
||||
{
|
||||
if (host_has_little_endianness()) {
|
||||
return endianness == TLM_LITTLE_ENDIAN;
|
||||
|
||||
} else {
|
||||
return endianness == TLM_BIG_ENDIAN;
|
||||
}
|
||||
}
|
||||
if (host_has_little_endianness()) {
|
||||
return endianness == TLM_LITTLE_ENDIAN;
|
||||
} else {
|
||||
return endianness == TLM_BIG_ENDIAN;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif /* __TLM_HELPERS_H__ */
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOAD_TLM_HELPERS_H__ */
|
||||
|
||||
@@ -17,92 +17,101 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_CORE_TLM2_TLM_PHASE_H_INCLUDED_
|
||||
#define TLM_CORE_TLM2_TLM_PHASE_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOAD_TLM_PHASE_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOAD_TLM_PHASE_H__
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <typeinfo>
|
||||
#include <vector>
|
||||
|
||||
#include "sysc/kernel/sc_cmnhdr.h" // SC_API
|
||||
#include "sysc/kernel/sc_macros.h" // SC_CONCAT_HELPER_, SC_STRINGIFY_HELPER_
|
||||
#define SC_CONCAT_HELPER_(a, b) SC_CONCAT_HELPER_DEFERRED_(a, b)
|
||||
#define SC_CONCAT_HELPER_DEFERRED_(a, b) SC_CONCAT_HELPER_MORE_DEFERRED_(a, b)
|
||||
#define SC_CONCAT_HELPER_MORE_DEFERRED_(a, b) a ## b
|
||||
|
||||
namespace tlm {
|
||||
#define SC_STRINGIFY_HELPER_(a) SC_STRINGIFY_HELPER_DEFERRED_(a)
|
||||
#define SC_STRINGIFY_HELPER_DEFERRED_(a) SC_STRINGIFY_HELPER_MORE_DEFERRED_(a)
|
||||
#define SC_STRINGIFY_HELPER_MORE_DEFERRED_(a) #a
|
||||
|
||||
enum SC_API tlm_phase_enum
|
||||
namespace tlm
|
||||
{
|
||||
UNINITIALIZED_PHASE=0,
|
||||
BEGIN_REQ=1,
|
||||
END_REQ,
|
||||
BEGIN_RESP,
|
||||
END_RESP
|
||||
|
||||
enum tlm_phase_enum
|
||||
{
|
||||
UNINITIALIZED_PHASE = 0,
|
||||
BEGIN_REQ = 1,
|
||||
END_REQ,
|
||||
BEGIN_RESP,
|
||||
END_RESP
|
||||
};
|
||||
|
||||
class SC_API tlm_phase
|
||||
class tlm_phase
|
||||
{
|
||||
public:
|
||||
tlm_phase();
|
||||
tlm_phase(unsigned int id); // TODO: should be dropped
|
||||
public:
|
||||
tlm_phase();
|
||||
tlm_phase(unsigned int id);
|
||||
|
||||
tlm_phase(tlm_phase_enum standard);
|
||||
tlm_phase& operator=(tlm_phase_enum standard);
|
||||
tlm_phase(tlm_phase_enum standard);
|
||||
tlm_phase &operator = (tlm_phase_enum standard);
|
||||
|
||||
operator unsigned int() const { return m_id; }
|
||||
const char* get_name() const;
|
||||
operator unsigned int() const { return m_id; }
|
||||
const char *get_name() const;
|
||||
|
||||
protected:
|
||||
// register extended phase
|
||||
tlm_phase( const std::type_info & type, const char* name );
|
||||
protected:
|
||||
// Register extended phase.
|
||||
tlm_phase(const std::type_info &type, const char *name);
|
||||
|
||||
private:
|
||||
unsigned int m_id;
|
||||
private:
|
||||
unsigned int m_id;
|
||||
};
|
||||
|
||||
inline
|
||||
tlm_phase::tlm_phase()
|
||||
: m_id( UNINITIALIZED_PHASE )
|
||||
{}
|
||||
inline tlm_phase::tlm_phase() : m_id(UNINITIALIZED_PHASE) {}
|
||||
|
||||
inline
|
||||
tlm_phase::tlm_phase( tlm_phase_enum standard )
|
||||
: m_id( standard )
|
||||
{}
|
||||
inline tlm_phase::tlm_phase(tlm_phase_enum standard) : m_id(standard) {}
|
||||
|
||||
inline
|
||||
tlm_phase& tlm_phase::operator=( tlm_phase_enum standard )
|
||||
inline tlm_phase &
|
||||
tlm_phase::operator = (tlm_phase_enum standard)
|
||||
{
|
||||
m_id = standard;
|
||||
return *this;
|
||||
m_id = standard;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline
|
||||
std::ostream& operator<<(std::ostream& s, const tlm_phase& p)
|
||||
inline std::ostream &
|
||||
operator << (std::ostream &s, const tlm_phase &p)
|
||||
{
|
||||
s << p.get_name();
|
||||
return s;
|
||||
s << p.get_name();
|
||||
return s;
|
||||
}
|
||||
|
||||
#define TLM_DECLARE_EXTENDED_PHASE(name_arg) \
|
||||
static class SC_CONCAT_HELPER_(tlm_phase_, name_arg) \
|
||||
: public ::tlm::tlm_phase \
|
||||
{ \
|
||||
static class SC_CONCAT_HELPER_(tlm_phase_, name_arg) : \
|
||||
public ::tlm::tlm_phase \
|
||||
{ \
|
||||
typedef SC_CONCAT_HELPER_(tlm_phase_, name_arg) this_type; \
|
||||
public: \
|
||||
SC_CONCAT_HELPER_(tlm_phase_, name_arg)() /* register extended phase */ \
|
||||
: ::tlm::tlm_phase( typeid(*this), SC_STRINGIFY_HELPER_(name_arg) ) \
|
||||
SC_CONCAT_HELPER_(tlm_phase_, name_arg)() : \
|
||||
/* register extended phase */ \
|
||||
::tlm::tlm_phase(typeid(*this), SC_STRINGIFY_HELPER_(name_arg)) \
|
||||
{} \
|
||||
\
|
||||
static const this_type& get_phase() /* needed only for IEEE 1666-2011 */ \
|
||||
{ static this_type this_; return this_; } \
|
||||
} \
|
||||
const name_arg
|
||||
static const this_type &get_phase() \
|
||||
/* needed only for IEEE 1666-2011 */ \
|
||||
{ \
|
||||
static this_type this_; \
|
||||
return this_; \
|
||||
} \
|
||||
} const name_arg
|
||||
|
||||
// for backwards-compatibility
|
||||
#define DECLARE_EXTENDED_PHASE( NameArg ) \
|
||||
TLM_DECLARE_EXTENDED_PHASE( NameArg )
|
||||
#define DECLARE_EXTENDED_PHASE(NameArg) TLM_DECLARE_EXTENDED_PHASE(NameArg)
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif /* TLM_CORE_TLM2_TLM_PHASE_H_INCLUDED_ */
|
||||
// Taf!
|
||||
#undef SC_CONCAT_HELPER_
|
||||
#undef SC_CONCAT_HELPER_DEFERRED_
|
||||
#undef SC_CONCAT_HELPER_MORE_DEFERRED_
|
||||
|
||||
#undef SC_STRINGIFY_HELPER_
|
||||
#undef SC_STRINGIFY_HELPER_DEFERRED_
|
||||
#undef SC_STRINGIFY_HELPER_MORE_DEFERRED_
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_GENERIC_PAYLOAD_TLM_PHASE_H__ */
|
||||
|
||||
@@ -17,12 +17,13 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_CORE_TLM2_TLM_GLOBAL_QUANTUM_H_INCLUDED_
|
||||
#define TLM_CORE_TLM2_TLM_GLOBAL_QUANTUM_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_QUANTUM_TLM_GLOBAL_QUANTUM_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_QUANTUM_TLM_GLOBAL_QUANTUM_H__
|
||||
|
||||
#include "sysc/kernel/sc_time.h"
|
||||
#include <systemc>
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
//
|
||||
// tlm_global_quantum class
|
||||
@@ -38,45 +39,38 @@ namespace tlm {
|
||||
// the global quantum is set.
|
||||
//
|
||||
|
||||
class SC_API tlm_global_quantum
|
||||
class tlm_global_quantum
|
||||
{
|
||||
public:
|
||||
//
|
||||
// Returns a reference to the tlm_global_quantum singleton
|
||||
//
|
||||
static tlm_global_quantum& instance();
|
||||
public:
|
||||
//
|
||||
// Returns a reference to the tlm_global_quantum singleton
|
||||
//
|
||||
static tlm_global_quantum &instance();
|
||||
|
||||
public:
|
||||
public:
|
||||
|
||||
//
|
||||
// Setter/getter for the global quantum
|
||||
//
|
||||
void set(const sc_core::sc_time& t)
|
||||
{
|
||||
m_global_quantum = t;
|
||||
}
|
||||
//
|
||||
// Setter/getter for the global quantum
|
||||
//
|
||||
void set(const sc_core::sc_time &t) { m_global_quantum = t; }
|
||||
const sc_core::sc_time &get() const { return m_global_quantum; }
|
||||
|
||||
const sc_core::sc_time& get() const
|
||||
{
|
||||
return m_global_quantum;
|
||||
}
|
||||
//
|
||||
// This function will calculate the maximum value for the next local
|
||||
// quantum for an initiator. All initiators should synchronize on
|
||||
// integer multiples of the global quantum value. The value for the
|
||||
// local quantum of an initiator can be smaller, but should never be
|
||||
// greater than the value returned by this method.
|
||||
//
|
||||
sc_core::sc_time compute_local_quantum();
|
||||
|
||||
//
|
||||
// This function will calculate the maximum value for the next local
|
||||
// quantum for an initiator. All initiators should synchronize on
|
||||
// integer multiples of the global quantum value. The value for the
|
||||
// local quantum of an initiator can be smaller, but should never be
|
||||
// greater than the value returned by this method.
|
||||
//
|
||||
sc_core::sc_time compute_local_quantum();
|
||||
protected:
|
||||
tlm_global_quantum();
|
||||
|
||||
protected:
|
||||
tlm_global_quantum();
|
||||
|
||||
protected:
|
||||
sc_core::sc_time m_global_quantum;
|
||||
protected:
|
||||
sc_core::sc_time m_global_quantum;
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif // TLM_CORE_TLM2_TLM_GLOBAL_QUANTUM_H_INCLUDED_
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_QUANTUM_TLM_GLOBAL_QUANTUM_H__ */
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_CORE_TLM2_TLM_QUANTUM_H_INCLUDED_
|
||||
#define TLM_CORE_TLM2_TLM_QUANTUM_H_INCLUDED_
|
||||
#ifndef ____SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_QUANTUM_TLM_QUANTUM_H__
|
||||
#define ____SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_QUANTUM_TLM_QUANTUM_H__
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_quantum/tlm_global_quantum.h"
|
||||
|
||||
#endif // TLM_CORE_TLM2_TLM_QUANTUM_H_INCLUDED_
|
||||
#endif /* ____SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_QUANTUM_TLM_QUANTUM_H__ */
|
||||
|
||||
@@ -17,12 +17,13 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_CORE_TLM_BASE_SOCKET_IF_H_INCLUDED_
|
||||
#define TLM_CORE_TLM_BASE_SOCKET_IF_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_BASE_SOCKET_IF_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_BASE_SOCKET_IF_H__
|
||||
|
||||
#include "sysc/utils/sc_typeindex.h"
|
||||
#include <systemc>
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
enum tlm_socket_category
|
||||
{
|
||||
@@ -38,19 +39,19 @@ enum tlm_socket_category
|
||||
|
||||
class tlm_base_socket_if
|
||||
{
|
||||
public:
|
||||
virtual sc_core::sc_port_base & get_port_base() = 0;
|
||||
virtual sc_core::sc_port_base const & get_port_base() const = 0;
|
||||
virtual sc_core::sc_export_base & get_export_base() = 0;
|
||||
virtual sc_core::sc_export_base const & get_export_base() const = 0;
|
||||
virtual unsigned int get_bus_width() const = 0;
|
||||
virtual sc_core::sc_type_index get_protocol_types() const = 0;
|
||||
virtual tlm_socket_category get_socket_category() const = 0;
|
||||
|
||||
protected:
|
||||
virtual ~tlm_base_socket_if() {}
|
||||
public:
|
||||
virtual sc_core::sc_port_base &get_port_base() = 0;
|
||||
virtual sc_core::sc_port_base const &get_port_base() const = 0;
|
||||
virtual sc_core::sc_export_base &get_export_base() = 0;
|
||||
virtual sc_core::sc_export_base const &get_export_base() const = 0;
|
||||
virtual unsigned int get_bus_width() const = 0;
|
||||
virtual sc_core::sc_type_index get_protocol_types() const = 0;
|
||||
virtual tlm_socket_category get_socket_category() const = 0;
|
||||
|
||||
protected:
|
||||
virtual ~tlm_base_socket_if() {}
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif // TLM_CORE_TLM_BASE_SOCKET_IF_H_INCLUDED_
|
||||
#endif // __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_BASE_SOCKET_IF_H__
|
||||
|
||||
@@ -17,224 +17,188 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_CORE_TLM_INITIATOR_SOCKET_H_INCLUDED_
|
||||
#define TLM_CORE_TLM_INITIATOR_SOCKET_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_INITIATOR_SOCKET_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_INITIATOR_SOCKET_H__
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_sockets/tlm_base_socket_if.h"
|
||||
#include "tlm_core/tlm_2/tlm_2_interfaces/tlm_fw_bw_ifs.h"
|
||||
|
||||
#if defined(__clang__) || \
|
||||
(defined(__GNUC__) && ((__GNUC__ * 1000 + __GNUC_MINOR__) >= 4006))
|
||||
// ignore warning about deliberately hidden "bind()" overloads
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Woverloaded-virtual"
|
||||
#endif
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
namespace tlm {
|
||||
|
||||
template <unsigned int BUSWIDTH = 32,
|
||||
typename FW_IF = tlm_fw_transport_if<>,
|
||||
typename BW_IF = tlm_bw_transport_if<> >
|
||||
template <unsigned int BUSWIDTH=32,
|
||||
typename FW_IF=tlm_fw_transport_if<>,
|
||||
typename BW_IF=tlm_bw_transport_if<>>
|
||||
class tlm_base_initiator_socket_b
|
||||
{
|
||||
public:
|
||||
virtual ~tlm_base_initiator_socket_b() {}
|
||||
public:
|
||||
virtual ~tlm_base_initiator_socket_b() {}
|
||||
|
||||
virtual sc_core::sc_port_b<FW_IF> & get_base_port() = 0;
|
||||
virtual sc_core::sc_port_b<FW_IF> const & get_base_port() const = 0;
|
||||
virtual BW_IF & get_base_interface() = 0;
|
||||
virtual BW_IF const & get_base_interface() const = 0;
|
||||
virtual sc_core::sc_export<BW_IF> & get_base_export() = 0;
|
||||
virtual sc_core::sc_export<BW_IF> const & get_base_export() const = 0;
|
||||
virtual sc_core::sc_port_b<FW_IF> &get_base_port() = 0;
|
||||
virtual sc_core::sc_port_b<FW_IF> const &get_base_port() const = 0;
|
||||
virtual BW_IF &get_base_interface() = 0;
|
||||
virtual BW_IF const &get_base_interface() const = 0;
|
||||
virtual sc_core::sc_export<BW_IF> &get_base_export() = 0;
|
||||
virtual sc_core::sc_export<BW_IF> const &get_base_export() const = 0;
|
||||
};
|
||||
|
||||
template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF>
|
||||
class tlm_base_target_socket_b;
|
||||
|
||||
template <unsigned int BUSWIDTH,
|
||||
typename FW_IF,
|
||||
typename BW_IF> class tlm_base_target_socket_b;
|
||||
template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N,
|
||||
sc_core::sc_port_policy POL>
|
||||
class tlm_base_target_socket;
|
||||
|
||||
template <unsigned int BUSWIDTH,
|
||||
typename FW_IF,
|
||||
typename BW_IF,
|
||||
int N,
|
||||
sc_core::sc_port_policy POL> class tlm_base_target_socket;
|
||||
|
||||
template <unsigned int BUSWIDTH = 32,
|
||||
typename FW_IF = tlm_fw_transport_if<>,
|
||||
typename BW_IF = tlm_bw_transport_if<>,
|
||||
int N = 1,
|
||||
sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class tlm_base_initiator_socket : public tlm_base_socket_if,
|
||||
public tlm_base_initiator_socket_b<BUSWIDTH, FW_IF, BW_IF>,
|
||||
public sc_core::sc_port<FW_IF, N, POL>
|
||||
template <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>,
|
||||
typename BW_IF=tlm_bw_transport_if<>, int N=1,
|
||||
sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class tlm_base_initiator_socket :
|
||||
public tlm_base_socket_if,
|
||||
public tlm_base_initiator_socket_b<BUSWIDTH, FW_IF, BW_IF>,
|
||||
public sc_core::sc_port<FW_IF, N, POL>
|
||||
{
|
||||
public:
|
||||
typedef FW_IF fw_interface_type;
|
||||
typedef BW_IF bw_interface_type;
|
||||
typedef sc_core::sc_port<fw_interface_type,N,POL> port_type;
|
||||
public:
|
||||
typedef FW_IF fw_interface_type;
|
||||
typedef BW_IF bw_interface_type;
|
||||
typedef sc_core::sc_port<fw_interface_type, N, POL> port_type;
|
||||
|
||||
typedef sc_core::sc_export<bw_interface_type> export_type;
|
||||
typedef sc_core::sc_export<bw_interface_type> export_type;
|
||||
|
||||
typedef tlm_base_target_socket_b<BUSWIDTH,
|
||||
fw_interface_type,
|
||||
bw_interface_type> base_target_socket_type;
|
||||
typedef tlm_base_initiator_socket_b<BUSWIDTH,
|
||||
fw_interface_type,
|
||||
bw_interface_type> base_type;
|
||||
typedef tlm_base_target_socket_b<
|
||||
BUSWIDTH, fw_interface_type, bw_interface_type>
|
||||
base_target_socket_type;
|
||||
typedef tlm_base_initiator_socket_b<
|
||||
BUSWIDTH, fw_interface_type, bw_interface_type> base_type;
|
||||
|
||||
template <unsigned int, typename, typename, int, sc_core::sc_port_policy>
|
||||
friend class tlm_base_target_socket;
|
||||
template <unsigned int, typename, typename, int, sc_core::sc_port_policy>
|
||||
friend class tlm_base_target_socket;
|
||||
|
||||
public:
|
||||
tlm_base_initiator_socket()
|
||||
: port_type(sc_core::sc_gen_unique_name("tlm_base_initiator_socket"))
|
||||
, m_export(sc_core::sc_gen_unique_name("tlm_base_initiator_socket_export"))
|
||||
{
|
||||
}
|
||||
public:
|
||||
tlm_base_initiator_socket() :
|
||||
port_type(sc_core::sc_gen_unique_name("tlm_base_initiator_socket")),
|
||||
m_export(sc_core::sc_gen_unique_name(
|
||||
"tlm_base_initiator_socket_export"))
|
||||
{}
|
||||
|
||||
explicit tlm_base_initiator_socket(const char* name)
|
||||
: port_type(name)
|
||||
, m_export(sc_core::sc_gen_unique_name((std::string(name) + "_export").c_str()))
|
||||
{
|
||||
}
|
||||
explicit tlm_base_initiator_socket(const char *name) : port_type(name),
|
||||
m_export(sc_core::sc_gen_unique_name(
|
||||
(std::string(name) + "_export").c_str()))
|
||||
{}
|
||||
|
||||
virtual const char* kind() const
|
||||
{
|
||||
return "tlm_base_initiator_socket";
|
||||
}
|
||||
virtual const char* kind() const { return "tlm_base_initiator_socket"; }
|
||||
|
||||
//
|
||||
// Bind initiator socket to target socket
|
||||
// - Binds the port of the initiator socket to the export of the target
|
||||
// socket
|
||||
// - Binds the port of the target socket to the export of the initiator
|
||||
// socket
|
||||
//
|
||||
virtual void bind(base_target_socket_type& s)
|
||||
{
|
||||
// initiator.port -> target.export
|
||||
(get_base_port())(s.get_base_interface());
|
||||
// target.port -> initiator.export
|
||||
(s.get_base_port())(get_base_interface());
|
||||
}
|
||||
//
|
||||
// Bind initiator socket to target socket
|
||||
// - Binds the port of the initiator socket to the export of the target
|
||||
// socket
|
||||
// - Binds the port of the target socket to the export of the initiator
|
||||
// socket
|
||||
//
|
||||
virtual void
|
||||
bind(base_target_socket_type &s)
|
||||
{
|
||||
// initiator.port -> target.export
|
||||
(get_base_port())(s.get_base_interface());
|
||||
// target.port -> initiator.export
|
||||
(s.get_base_port())(get_base_interface());
|
||||
}
|
||||
|
||||
void operator() (base_target_socket_type& s)
|
||||
{
|
||||
bind(s);
|
||||
}
|
||||
void operator () (base_target_socket_type &s) { bind(s); }
|
||||
|
||||
//
|
||||
// Bind initiator socket to initiator socket (hierarchical bind)
|
||||
// - Binds both the export and the port
|
||||
//
|
||||
virtual void bind(base_type& s)
|
||||
{
|
||||
// port
|
||||
(get_base_port())(s.get_base_port());
|
||||
// export
|
||||
(s.get_base_export())(get_base_export());
|
||||
}
|
||||
//
|
||||
// Bind initiator socket to initiator socket (hierarchical bind)
|
||||
// - Binds both the export and the port
|
||||
//
|
||||
virtual void
|
||||
bind(base_type &s)
|
||||
{
|
||||
// port
|
||||
(get_base_port())(s.get_base_port());
|
||||
// export
|
||||
(s.get_base_export())(get_base_export());
|
||||
}
|
||||
|
||||
void operator() (base_type& s)
|
||||
{
|
||||
bind(s);
|
||||
}
|
||||
void operator() (base_type &s) { bind(s); }
|
||||
|
||||
//
|
||||
// Bind interface to socket
|
||||
// - Binds the interface to the export of this socket
|
||||
//
|
||||
virtual void bind(bw_interface_type& ifs)
|
||||
{
|
||||
(get_base_export())(ifs);
|
||||
}
|
||||
//
|
||||
// Bind interface to socket
|
||||
// - Binds the interface to the export of this socket
|
||||
//
|
||||
virtual void bind(bw_interface_type &ifs) { (get_base_export())(ifs); }
|
||||
void operator() (bw_interface_type &s) { bind(s); }
|
||||
|
||||
void operator() (bw_interface_type& s)
|
||||
{
|
||||
bind(s);
|
||||
}
|
||||
// Implementation of tlm_base_socket_if functions
|
||||
virtual sc_core::sc_port_base &get_port_base() { return *this; }
|
||||
virtual sc_core::sc_port_base const &
|
||||
get_port_base() const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
virtual sc_core::sc_export_base &get_export_base() { return m_export; }
|
||||
virtual sc_core::sc_export_base const &
|
||||
get_export_base() const
|
||||
{
|
||||
return m_export;
|
||||
}
|
||||
virtual unsigned int get_bus_width() const { return BUSWIDTH; }
|
||||
virtual tlm_socket_category
|
||||
get_socket_category() const
|
||||
{
|
||||
return TLM_INITIATOR_SOCKET;
|
||||
}
|
||||
|
||||
// Implementation of tlm_base_socket_if functions
|
||||
virtual sc_core::sc_port_base & get_port_base()
|
||||
{ return *this; }
|
||||
virtual sc_core::sc_port_base const & get_port_base() const
|
||||
{ return *this; }
|
||||
virtual sc_core::sc_export_base & get_export_base()
|
||||
{ return m_export; }
|
||||
virtual sc_core::sc_export_base const & get_export_base() const
|
||||
{ return m_export; }
|
||||
virtual unsigned int get_bus_width() const
|
||||
{ return BUSWIDTH; }
|
||||
virtual tlm_socket_category get_socket_category() const
|
||||
{ return TLM_INITIATOR_SOCKET; }
|
||||
// Implementation of tlm_base_target_socket_b functions
|
||||
virtual sc_core::sc_port_b<FW_IF> &get_base_port() { return *this; }
|
||||
virtual sc_core::sc_port_b<FW_IF> const &
|
||||
get_base_port() const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Implementation of tlm_base_target_socket_b functions
|
||||
virtual sc_core::sc_port_b<FW_IF> & get_base_port()
|
||||
{ return *this; }
|
||||
virtual sc_core::sc_port_b<FW_IF> const & get_base_port() const
|
||||
{ return *this; }
|
||||
virtual BW_IF &get_base_interface() { return m_export; }
|
||||
virtual BW_IF const &get_base_interface() const { return m_export; }
|
||||
|
||||
virtual BW_IF & get_base_interface()
|
||||
{ return m_export; }
|
||||
virtual BW_IF const & get_base_interface() const
|
||||
{ return m_export; }
|
||||
virtual sc_core::sc_export<BW_IF> &get_base_export() { return m_export; }
|
||||
virtual sc_core::sc_export<BW_IF> const &
|
||||
get_base_export() const
|
||||
{
|
||||
return m_export;
|
||||
}
|
||||
|
||||
virtual sc_core::sc_export<BW_IF> & get_base_export()
|
||||
{ return m_export; }
|
||||
virtual sc_core::sc_export<BW_IF> const & get_base_export() const
|
||||
{ return m_export; }
|
||||
|
||||
protected:
|
||||
export_type m_export;
|
||||
protected:
|
||||
export_type m_export;
|
||||
};
|
||||
|
||||
//
|
||||
// Convenience socket classes
|
||||
//
|
||||
|
||||
template <unsigned int BUSWIDTH = 32,
|
||||
typename TYPES = tlm_base_protocol_types,
|
||||
int N = 1,
|
||||
sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class tlm_initiator_socket :
|
||||
public tlm_base_initiator_socket<BUSWIDTH,
|
||||
tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>,
|
||||
N, POL>
|
||||
template <unsigned int BUSWIDTH=32, typename TYPES=tlm_base_protocol_types,
|
||||
int N=1, sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class tlm_initiator_socket : public tlm_base_initiator_socket<
|
||||
BUSWIDTH, tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>, N, POL>
|
||||
{
|
||||
public:
|
||||
tlm_initiator_socket() :
|
||||
tlm_base_initiator_socket<BUSWIDTH,
|
||||
tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>,
|
||||
N, POL>()
|
||||
{
|
||||
}
|
||||
public:
|
||||
tlm_initiator_socket() : tlm_base_initiator_socket<
|
||||
BUSWIDTH, tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>, N, POL>()
|
||||
{}
|
||||
|
||||
explicit tlm_initiator_socket(const char* name) :
|
||||
tlm_base_initiator_socket<BUSWIDTH,
|
||||
tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>,
|
||||
N, POL>(name)
|
||||
{
|
||||
}
|
||||
explicit tlm_initiator_socket(const char *name) :
|
||||
tlm_base_initiator_socket<BUSWIDTH, tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>, N, POL>(name)
|
||||
{}
|
||||
|
||||
virtual const char* kind() const
|
||||
{
|
||||
return "tlm_initiator_socket";
|
||||
}
|
||||
virtual const char *kind() const { return "tlm_initiator_socket"; }
|
||||
|
||||
virtual sc_core::sc_type_index get_protocol_types() const
|
||||
{
|
||||
return typeid(TYPES);
|
||||
}
|
||||
virtual sc_core::sc_type_index
|
||||
get_protocol_types() const
|
||||
{
|
||||
return typeid(TYPES);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#if defined(__clang__) || \
|
||||
(defined(__GNUC__) && ((__GNUC__ * 1000 + __GNUC_MINOR__) >= 4006))
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
#endif // TLM_CORE_TLM_INITIATOR_SOCKET_H_INCLUDED_
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_INITIATOR_SOCKET_H__ */
|
||||
|
||||
@@ -17,10 +17,10 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __TLM_SOCKETS_H__
|
||||
#define __TLM_SOCKETS_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_SOCKETS_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_SOCKETS_H__
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_sockets/tlm_initiator_socket.h"
|
||||
#include "tlm_core/tlm_2/tlm_sockets/tlm_target_socket.h"
|
||||
|
||||
#endif /* __TLM_SOCKETS_H__ */
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_SOCKETS_H__ */
|
||||
|
||||
@@ -17,239 +17,207 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_CORE_TLM_TARGET_SOCKET_H_INCLUDED_
|
||||
#define TLM_CORE_TLM_TARGET_SOCKET_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_TARGET_SOCKET_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_TARGET_SOCKET_H__
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_sockets/tlm_base_socket_if.h"
|
||||
#include "tlm_core/tlm_2/tlm_2_interfaces/tlm_fw_bw_ifs.h"
|
||||
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
namespace tlm {
|
||||
|
||||
template <unsigned int BUSWIDTH = 32,
|
||||
typename FW_IF = tlm_fw_transport_if<>,
|
||||
typename BW_IF = tlm_bw_transport_if<> >
|
||||
template <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>,
|
||||
typename BW_IF=tlm_bw_transport_if<>>
|
||||
class tlm_base_target_socket_b
|
||||
{
|
||||
public:
|
||||
virtual ~tlm_base_target_socket_b() {}
|
||||
public:
|
||||
virtual ~tlm_base_target_socket_b() {}
|
||||
|
||||
virtual sc_core::sc_port_b<BW_IF> & get_base_port() = 0;
|
||||
virtual sc_core::sc_export<FW_IF> & get_base_export() = 0;
|
||||
virtual FW_IF & get_base_interface() = 0;
|
||||
virtual sc_core::sc_port_b<BW_IF> &get_base_port() = 0;
|
||||
virtual sc_core::sc_export<FW_IF> &get_base_export() = 0;
|
||||
virtual FW_IF &get_base_interface() = 0;
|
||||
};
|
||||
|
||||
template <unsigned int BUSWIDTH,
|
||||
typename FW_IF,
|
||||
typename BW_IF> class tlm_base_initiator_socket_b;
|
||||
template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF>
|
||||
class tlm_base_initiator_socket_b;
|
||||
|
||||
template <unsigned int BUSWIDTH,
|
||||
typename FW_IF,
|
||||
typename BW_IF,
|
||||
int N,
|
||||
sc_core::sc_port_policy POL> class tlm_base_initiator_socket;
|
||||
template <unsigned int BUSWIDTH, typename FW_IF, typename BW_IF, int N,
|
||||
sc_core::sc_port_policy POL>
|
||||
class tlm_base_initiator_socket;
|
||||
|
||||
template <unsigned int BUSWIDTH = 32,
|
||||
typename FW_IF = tlm_fw_transport_if<>,
|
||||
typename BW_IF = tlm_bw_transport_if<>,
|
||||
int N = 1,
|
||||
sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class tlm_base_target_socket : public tlm_base_socket_if,
|
||||
public tlm_base_target_socket_b<BUSWIDTH, FW_IF, BW_IF>,
|
||||
public sc_core::sc_export<FW_IF>
|
||||
template <unsigned int BUSWIDTH=32, typename FW_IF=tlm_fw_transport_if<>,
|
||||
typename BW_IF=tlm_bw_transport_if<>, int N=1,
|
||||
sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class tlm_base_target_socket :
|
||||
public tlm_base_socket_if,
|
||||
public tlm_base_target_socket_b<BUSWIDTH, FW_IF, BW_IF>,
|
||||
public sc_core::sc_export<FW_IF>
|
||||
{
|
||||
public:
|
||||
typedef FW_IF fw_interface_type;
|
||||
typedef BW_IF bw_interface_type;
|
||||
typedef sc_core::sc_port<bw_interface_type, N , POL> port_type;
|
||||
public:
|
||||
typedef FW_IF fw_interface_type;
|
||||
typedef BW_IF bw_interface_type;
|
||||
typedef sc_core::sc_port<bw_interface_type, N, POL> port_type;
|
||||
|
||||
typedef sc_core::sc_export<fw_interface_type> export_type;
|
||||
typedef tlm_base_initiator_socket_b<BUSWIDTH,
|
||||
fw_interface_type,
|
||||
bw_interface_type> base_initiator_socket_type;
|
||||
typedef sc_core::sc_export<fw_interface_type> export_type;
|
||||
typedef tlm_base_initiator_socket_b<
|
||||
BUSWIDTH, fw_interface_type, bw_interface_type>
|
||||
base_initiator_socket_type;
|
||||
|
||||
typedef tlm_base_target_socket_b<BUSWIDTH,
|
||||
fw_interface_type,
|
||||
bw_interface_type> base_type;
|
||||
typedef tlm_base_target_socket_b<
|
||||
BUSWIDTH, fw_interface_type, bw_interface_type> base_type;
|
||||
|
||||
template <unsigned int, typename, typename, int, sc_core::sc_port_policy>
|
||||
friend class tlm_base_initiator_socket;
|
||||
template <unsigned int, typename, typename, int, sc_core::sc_port_policy>
|
||||
friend class tlm_base_initiator_socket;
|
||||
|
||||
public:
|
||||
tlm_base_target_socket()
|
||||
: export_type(sc_core::sc_gen_unique_name("tlm_base_target_socket"))
|
||||
, m_port(sc_core::sc_gen_unique_name("tlm_base_target_socket_port"))
|
||||
{
|
||||
}
|
||||
public:
|
||||
tlm_base_target_socket() :
|
||||
export_type(sc_core::sc_gen_unique_name("tlm_base_target_socket")),
|
||||
m_port(sc_core::sc_gen_unique_name("tlm_base_target_socket_port"))
|
||||
{}
|
||||
|
||||
explicit tlm_base_target_socket(const char* name)
|
||||
: export_type(name)
|
||||
, m_port(sc_core::sc_gen_unique_name((std::string(name) + "_port").c_str()))
|
||||
{
|
||||
}
|
||||
explicit tlm_base_target_socket(const char *name) :
|
||||
export_type(name), m_port(sc_core::sc_gen_unique_name(
|
||||
(std::string(name) + "_port").c_str()))
|
||||
{}
|
||||
|
||||
virtual const char* kind() const
|
||||
{
|
||||
return "tlm_base_target_socket";
|
||||
}
|
||||
virtual const char *kind() const { return "tlm_base_target_socket"; }
|
||||
|
||||
//
|
||||
// Bind target socket to initiator socket
|
||||
// - Binds the port of the initiator socket to the export of the target
|
||||
// socket
|
||||
// - Binds the port of the target socket to the export of the initiator
|
||||
// socket
|
||||
//
|
||||
virtual void bind(base_initiator_socket_type& s)
|
||||
{
|
||||
// initiator.port -> target.export
|
||||
(s.get_base_port())(get_base_interface());
|
||||
// target.port -> initiator.export
|
||||
get_base_port()(s.get_base_interface());
|
||||
}
|
||||
|
||||
void operator() (base_initiator_socket_type& s)
|
||||
{
|
||||
bind(s);
|
||||
}
|
||||
|
||||
//
|
||||
// Bind target socket to target socket (hierarchical bind)
|
||||
// - Binds both the export and the port
|
||||
//
|
||||
virtual void bind(base_type& s)
|
||||
{
|
||||
// export
|
||||
(get_base_export())(s.get_base_export());
|
||||
// port
|
||||
(s.get_base_port())(get_base_port());
|
||||
}
|
||||
|
||||
void operator() (base_type& s)
|
||||
{
|
||||
bind(s);
|
||||
}
|
||||
|
||||
//
|
||||
// Bind interface to socket
|
||||
// - Binds the interface to the export
|
||||
//
|
||||
virtual void bind(fw_interface_type& ifs)
|
||||
{
|
||||
export_type* exp = &get_base_export();
|
||||
if( this == exp ) {
|
||||
export_type::bind( ifs ); // non-virtual function call
|
||||
} else {
|
||||
exp->bind( ifs );
|
||||
//
|
||||
// Bind target socket to initiator socket
|
||||
// - Binds the port of the initiator socket to the export of the target
|
||||
// socket
|
||||
// - Binds the port of the target socket to the export of the initiator
|
||||
// socket
|
||||
//
|
||||
virtual void
|
||||
bind(base_initiator_socket_type &s)
|
||||
{
|
||||
// initiator.port -> target.export
|
||||
(s.get_base_port())(get_base_interface());
|
||||
// target.port -> initiator.export
|
||||
get_base_port()(s.get_base_interface());
|
||||
}
|
||||
}
|
||||
|
||||
void operator() (fw_interface_type& s)
|
||||
{
|
||||
bind(s);
|
||||
}
|
||||
void operator () (base_initiator_socket_type &s) { bind(s); }
|
||||
|
||||
//
|
||||
// Forward to 'size()' of port class
|
||||
//
|
||||
int size() const
|
||||
{
|
||||
return m_port.size();
|
||||
}
|
||||
//
|
||||
// Bind target socket to target socket (hierarchical bind)
|
||||
// - Binds both the export and the port
|
||||
//
|
||||
virtual void
|
||||
bind(base_type &s)
|
||||
{
|
||||
// export
|
||||
(get_base_export())(s.get_base_export());
|
||||
// port
|
||||
(s.get_base_port())(get_base_port());
|
||||
}
|
||||
|
||||
//
|
||||
// Forward to 'operator->()' of port class
|
||||
//
|
||||
bw_interface_type* operator->()
|
||||
{
|
||||
return m_port.operator->();
|
||||
}
|
||||
void operator () (base_type &s) { bind(s); }
|
||||
|
||||
//
|
||||
// Forward to 'operator[]()' of port class
|
||||
//
|
||||
bw_interface_type* operator[](int i)
|
||||
{
|
||||
return m_port.operator[](i);
|
||||
}
|
||||
//
|
||||
// Bind interface to socket
|
||||
// - Binds the interface to the export
|
||||
//
|
||||
virtual void
|
||||
bind(fw_interface_type &ifs)
|
||||
{
|
||||
export_type *exp = &get_base_export();
|
||||
if (this == exp) {
|
||||
export_type::bind(ifs);
|
||||
} else {
|
||||
exp->bind( ifs );
|
||||
}
|
||||
}
|
||||
|
||||
// Implementation of tlm_base_socket_if functions
|
||||
virtual sc_core::sc_port_base & get_port_base()
|
||||
{ return m_port; }
|
||||
virtual sc_core::sc_port_base const & get_port_base() const
|
||||
{ return m_port; }
|
||||
virtual sc_core::sc_export_base & get_export_base()
|
||||
{ return *this; }
|
||||
virtual sc_core::sc_export_base const & get_export_base() const
|
||||
{ return *this; }
|
||||
virtual unsigned int get_bus_width() const
|
||||
{ return BUSWIDTH; }
|
||||
virtual tlm_socket_category get_socket_category() const
|
||||
{ return TLM_TARGET_SOCKET; }
|
||||
void operator () (fw_interface_type &s) { bind(s); }
|
||||
|
||||
// Implementation of tlm_base_target_socket_b functions
|
||||
virtual sc_core::sc_port_b<BW_IF> & get_base_port()
|
||||
{ return m_port; }
|
||||
virtual sc_core::sc_port_b<BW_IF> const & get_base_port() const
|
||||
{ return m_port; }
|
||||
//
|
||||
// Forward to 'size()' of port class.
|
||||
//
|
||||
int size() const { return m_port.size(); }
|
||||
|
||||
virtual FW_IF & get_base_interface()
|
||||
{ return *this; }
|
||||
virtual FW_IF const & get_base_interface() const
|
||||
{ return *this; }
|
||||
//
|
||||
// Forward to 'operator->()' of port class.
|
||||
//
|
||||
bw_interface_type *operator->() { return m_port.operator->(); }
|
||||
|
||||
virtual sc_core::sc_export<FW_IF> & get_base_export()
|
||||
{ return *this; }
|
||||
virtual sc_core::sc_export<FW_IF> const & get_base_export() const
|
||||
{ return *this; }
|
||||
//
|
||||
// Forward to 'operator[]()' of port class.
|
||||
//
|
||||
bw_interface_type *operator[](int i) { return m_port.operator[](i); }
|
||||
|
||||
protected:
|
||||
port_type m_port;
|
||||
// Implementation of tlm_base_socket_if functions.
|
||||
virtual sc_core::sc_port_base &get_port_base() { return m_port; }
|
||||
virtual sc_core::sc_port_base const &
|
||||
get_port_base() const
|
||||
{
|
||||
return m_port;
|
||||
}
|
||||
virtual sc_core::sc_export_base &get_export_base() { return *this; }
|
||||
virtual sc_core::sc_export_base const &
|
||||
get_export_base() const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
virtual unsigned int get_bus_width() const { return BUSWIDTH; }
|
||||
virtual tlm_socket_category
|
||||
get_socket_category() const
|
||||
{
|
||||
return TLM_TARGET_SOCKET;
|
||||
}
|
||||
|
||||
// Implementation of tlm_base_target_socket_b functions
|
||||
virtual sc_core::sc_port_b<BW_IF> &get_base_port() { return m_port; }
|
||||
virtual sc_core::sc_port_b<BW_IF> const &
|
||||
get_base_port() const
|
||||
{
|
||||
return m_port;
|
||||
}
|
||||
|
||||
virtual FW_IF &get_base_interface() { return *this; }
|
||||
virtual FW_IF const &get_base_interface() const { return *this; }
|
||||
|
||||
virtual sc_core::sc_export<FW_IF> &get_base_export() { return *this; }
|
||||
virtual sc_core::sc_export<FW_IF> const &
|
||||
get_base_export() const
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
protected:
|
||||
port_type m_port;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Convenience blocking and non-blocking socket classes
|
||||
//
|
||||
|
||||
template <unsigned int BUSWIDTH = 32,
|
||||
typename TYPES = tlm_base_protocol_types,
|
||||
int N = 1,
|
||||
sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
template <unsigned int BUSWIDTH=32, typename TYPES=tlm_base_protocol_types,
|
||||
int N=1, sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class tlm_target_socket :
|
||||
public tlm_base_target_socket <BUSWIDTH,
|
||||
tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>,
|
||||
N, POL>
|
||||
public tlm_base_target_socket<
|
||||
BUSWIDTH, tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>, N, POL>
|
||||
{
|
||||
public:
|
||||
tlm_target_socket() :
|
||||
tlm_base_target_socket<BUSWIDTH,
|
||||
tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>,
|
||||
N, POL>()
|
||||
{
|
||||
}
|
||||
public:
|
||||
tlm_target_socket() :
|
||||
tlm_base_target_socket<
|
||||
BUSWIDTH, tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>, N, POL>()
|
||||
{}
|
||||
|
||||
explicit tlm_target_socket(const char* name) :
|
||||
tlm_base_target_socket<BUSWIDTH,
|
||||
tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>,
|
||||
N, POL>(name)
|
||||
{
|
||||
}
|
||||
explicit tlm_target_socket(const char *name) :
|
||||
tlm_base_target_socket<
|
||||
BUSWIDTH, tlm_fw_transport_if<TYPES>,
|
||||
tlm_bw_transport_if<TYPES>, N, POL>(name)
|
||||
{}
|
||||
|
||||
virtual const char* kind() const
|
||||
{
|
||||
return "tlm_target_socket";
|
||||
}
|
||||
virtual const char* kind() const { return "tlm_target_socket"; }
|
||||
|
||||
virtual sc_core::sc_type_index get_protocol_types() const
|
||||
{
|
||||
return typeid(TYPES);
|
||||
}
|
||||
virtual sc_core::sc_type_index
|
||||
get_protocol_types() const
|
||||
{
|
||||
return typeid(TYPES);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif // TLM_CORE_TLM_TARGET_SOCKET_H_INCLUDED_
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_SOCKETS_TLM_TARGET_SOCKET_H__ */
|
||||
|
||||
@@ -17,20 +17,16 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
/* ---------------------------------------------------------------------------------------
|
||||
@file tlm_version.h
|
||||
|
||||
@brief TLM version header
|
||||
|
||||
/* ---------------------------------------------------------------------------
|
||||
Original Author:
|
||||
Charles Wilson, XtremeEDA Corporation
|
||||
|
||||
@description
|
||||
This header contains preprocessor and compiler symbols to allow for the determination
|
||||
of the TLM version information. This conforms to IEEE 1666-2005 section 8.5.5 - 8.5.7
|
||||
.
|
||||
This header contains preprocessor and compiler symbols to allow for the
|
||||
determination of the TLM version information. This conforms to
|
||||
IEEE 1666-2005 section 8.5.5 - 8.5.7
|
||||
The following are provided:
|
||||
.
|
||||
|
||||
preprocessor: TLM_VERSION_MAJOR numeric
|
||||
TLM_VERSION_MINOR numeric
|
||||
TLM_VERSION_PATCH numeric
|
||||
@@ -40,7 +36,7 @@
|
||||
TLM_IS_PRERELEASE bool (1,0)
|
||||
TLM_VERSION string {2.0.0_DR3-TLMWG}
|
||||
TLM_COPYRIGHT string
|
||||
.
|
||||
|
||||
compiler: tlm_version_major const unsigned int
|
||||
tlm_version_minor const unsigned int
|
||||
tlm_version_patch const unsigned int
|
||||
@@ -50,131 +46,110 @@
|
||||
tlm_is_prerelease const bool
|
||||
tlm_version const string
|
||||
tlm_copyright const string
|
||||
.
|
||||
|
||||
accessors: inline const char* tlm_release (void)
|
||||
inline const char* tlm_version (void)
|
||||
inline const char* tlm_copyright (void)
|
||||
--------------------------------------------------------------------------- */
|
||||
|
||||
--------------------------------------------------------------------------------------- */
|
||||
|
||||
#ifndef __TLM_VERSION_H__
|
||||
#define __TLM_VERSION_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_VERSION_H__
|
||||
#define __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_VERSION_H__
|
||||
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
#define TLM_VERSION_MAJOR 2 ///< version major level ( numeric )
|
||||
#define TLM_VERSION_MINOR 0 ///< version minor level ( numeric )
|
||||
#define TLM_VERSION_PATCH 4 ///< version patch level ( numeric )
|
||||
#define TLM_VERSION_ORIGINATOR "Accellera" ///< TLM creator string
|
||||
#define TLM_VERSION_SEPARATOR "." ///< version string separator
|
||||
#define TLM_VERSION_MAJOR 2 ///< version major level ( numeric )
|
||||
#define TLM_VERSION_MINOR 0 ///< version minor level ( numeric )
|
||||
#define TLM_VERSION_PATCH 4 ///< version patch level ( numeric )
|
||||
#define TLM_VERSION_ORIGINATOR "Accellera" ///< TLM creator string
|
||||
#define TLM_VERSION_SEPARATOR "." ///< version string separator
|
||||
|
||||
#define TLM_IS_PRERELEASE 0 ///< pre-release flag ( 1 / 0 )
|
||||
#define TLM_IS_PRERELEASE 0 ///< pre-release flag (1/0)
|
||||
|
||||
#if TLM_IS_PRERELEASE
|
||||
# define TLM_VERSION_PRERELEASE "pub_rev" ///< pre-release version string
|
||||
# define TLM_VERSION_PRERELEASE "pub_rev" ///< pre-release version string
|
||||
#else
|
||||
# define TLM_VERSION_PRERELEASE "" ///< pre-release version string
|
||||
# define TLM_VERSION_PRERELEASE "" ///< pre-release version string
|
||||
#endif
|
||||
|
||||
#define TLM_VERSION_RELEASE_YEAR "2017" ///< release year ( YYYY )
|
||||
#define TLM_VERSION_RELEASE_MONTH "10" ///< release month ( MM )
|
||||
#define TLM_VERSION_RELEASE_DAY "12" ///< release day ( DD )
|
||||
#define TLM_VERSION_RELEASE_YEAR "2017" ///< release year ( YYYY )
|
||||
#define TLM_VERSION_RELEASE_MONTH "10" ///< release month ( MM )
|
||||
#define TLM_VERSION_RELEASE_DAY "12" ///< release day ( DD )
|
||||
|
||||
#define TLM_COPYRIGHT \
|
||||
"Copyright (c) 1996-" TLM_VERSION_RELEASE_YEAR " by all Contributors\n" \
|
||||
"ALL RIGHTS RESERVED"
|
||||
|
||||
/************************** do not modify below this line *******************************/
|
||||
/******************** do not modify below this line *************************/
|
||||
|
||||
/******************************* preprocessor symbols ***********************************/
|
||||
/************************* preprocessor symbols *****************************/
|
||||
|
||||
#define TLM_VERSION_RELEASE_DATE TLM_VERSION_RELEASE_YEAR \
|
||||
TLM_VERSION_RELEASE_MONTH \
|
||||
TLM_VERSION_RELEASE_DAY
|
||||
#define TLM_VERSION_RELEASE_DATE TLM_VERSION_RELEASE_YEAR \
|
||||
TLM_VERSION_RELEASE_MONTH \
|
||||
TLM_VERSION_RELEASE_DAY
|
||||
|
||||
#define TLM_VERSION_STR(x) TLM_VERSION_STR_HELPER(x)
|
||||
#define TLM_VERSION_STR_HELPER(x) #x
|
||||
#define TLM_VERSION_STR(x) TLM_VERSION_STR_HELPER(x)
|
||||
#define TLM_VERSION_STR_HELPER(x) #x
|
||||
|
||||
#define TLM_VERSION_STRING_MAJOR TLM_VERSION_STR(TLM_VERSION_MAJOR)
|
||||
#define TLM_VERSION_STRING_MINOR TLM_VERSION_STR(TLM_VERSION_MINOR)
|
||||
#define TLM_VERSION_STRING_PATCH TLM_VERSION_STR(TLM_VERSION_PATCH)
|
||||
#define TLM_VERSION_STRING_MAJOR TLM_VERSION_STR(TLM_VERSION_MAJOR)
|
||||
#define TLM_VERSION_STRING_MINOR TLM_VERSION_STR(TLM_VERSION_MINOR)
|
||||
#define TLM_VERSION_STRING_PATCH TLM_VERSION_STR(TLM_VERSION_PATCH)
|
||||
|
||||
#define TLM_VERSION_STRING_MMP TLM_VERSION_STRING_MAJOR TLM_VERSION_SEPARATOR \
|
||||
TLM_VERSION_STRING_MINOR TLM_VERSION_SEPARATOR \
|
||||
TLM_VERSION_STRING_PATCH
|
||||
#define TLM_VERSION_STRING_MMP TLM_VERSION_STRING_MAJOR TLM_VERSION_SEPARATOR \
|
||||
TLM_VERSION_STRING_MINOR TLM_VERSION_SEPARATOR \
|
||||
TLM_VERSION_STRING_PATCH
|
||||
|
||||
#define TLM_VERSION_STRING_PRE_START "_"
|
||||
#define TLM_VERSION_STRING_PRE_END "-"
|
||||
#define TLM_VERSION_STRING_PRE_START "_"
|
||||
#define TLM_VERSION_STRING_PRE_END "-"
|
||||
|
||||
#if ( TLM_IS_PRERELEASE == 1 )
|
||||
#if (TLM_IS_PRERELEASE == 1)
|
||||
|
||||
#define TLM_VERSION_STRING_PRERELEASE TLM_VERSION_PRERELEASE
|
||||
#define TLM_VERSION_STRING_RELEASE_DATE ""
|
||||
# define TLM_VERSION_STRING_PRERELEASE TLM_VERSION_PRERELEASE
|
||||
# define TLM_VERSION_STRING_RELEASE_DATE ""
|
||||
|
||||
#else /* TLM_IS_PRERELEASE == 1 */
|
||||
#else /* TLM_IS_PRERELEASE == 1 */
|
||||
|
||||
#define TLM_VERSION_STRING_PRERELEASE ""
|
||||
#define TLM_VERSION_STRING_RELEASE_DATE TLM_VERSION_RELEASE_DATE
|
||||
# define TLM_VERSION_STRING_PRERELEASE ""
|
||||
# define TLM_VERSION_STRING_RELEASE_DATE TLM_VERSION_RELEASE_DATE
|
||||
|
||||
#endif /* TLM_IS_PRERELEASE == 1 */
|
||||
#endif /* TLM_IS_PRERELEASE == 1 */
|
||||
|
||||
#define TLM_VERSION_STRING TLM_VERSION_STRING_MMP \
|
||||
TLM_VERSION_STRING_PRE_START \
|
||||
TLM_VERSION_STRING_PRERELEASE \
|
||||
TLM_VERSION_STRING_PRE_END \
|
||||
TLM_VERSION_ORIGINATOR
|
||||
#define TLM_VERSION_STRING TLM_VERSION_STRING_MMP \
|
||||
TLM_VERSION_STRING_PRE_START \
|
||||
TLM_VERSION_STRING_PRERELEASE \
|
||||
TLM_VERSION_STRING_PRE_END \
|
||||
TLM_VERSION_ORIGINATOR
|
||||
|
||||
#define TLM_VERSION_STRING_2 "TLM " \
|
||||
TLM_VERSION_STRING_MMP \
|
||||
" --- " \
|
||||
TLM_VERSION_RELEASE_YEAR \
|
||||
"-" \
|
||||
TLM_VERSION_RELEASE_MONTH \
|
||||
"-" \
|
||||
TLM_VERSION_RELEASE_DAY
|
||||
#define TLM_VERSION_STRING_2 "TLM " \
|
||||
TLM_VERSION_STRING_MMP \
|
||||
" --- " \
|
||||
TLM_VERSION_RELEASE_YEAR \
|
||||
"-" \
|
||||
TLM_VERSION_RELEASE_MONTH \
|
||||
"-" \
|
||||
TLM_VERSION_RELEASE_DAY
|
||||
|
||||
#define TLM_VERSION TLM_VERSION_STRING
|
||||
#define TLM_VERSION TLM_VERSION_STRING
|
||||
|
||||
/********************************* compiler symbols **************************************/
|
||||
/*************************** compiler symbols ********************************/
|
||||
|
||||
const unsigned int tlm_version_major ( TLM_VERSION_MAJOR );
|
||||
const unsigned int tlm_version_minor ( TLM_VERSION_MINOR );
|
||||
const unsigned int tlm_version_patch ( TLM_VERSION_PATCH );
|
||||
const unsigned int tlm_version_major(TLM_VERSION_MAJOR);
|
||||
const unsigned int tlm_version_minor(TLM_VERSION_MINOR);
|
||||
const unsigned int tlm_version_patch(TLM_VERSION_PATCH);
|
||||
|
||||
const bool tlm_is_prerelease ( TLM_IS_PRERELEASE );
|
||||
const bool tlm_is_prerelease(TLM_IS_PRERELEASE);
|
||||
|
||||
const std::string tlm_version_string ( TLM_VERSION_STRING );
|
||||
const std::string tlm_version_originator ( TLM_VERSION_ORIGINATOR );
|
||||
const std::string tlm_version_prerelease ( TLM_VERSION_PRERELEASE );
|
||||
const std::string tlm_version_release_date ( TLM_VERSION_STRING_RELEASE_DATE );
|
||||
const std::string tlm_copyright_string ( TLM_COPYRIGHT );
|
||||
const std::string tlm_version_string_2 ( TLM_VERSION_STRING_2 );
|
||||
const std::string tlm_version_string(TLM_VERSION_STRING);
|
||||
const std::string tlm_version_originator(TLM_VERSION_ORIGINATOR);
|
||||
const std::string tlm_version_prerelease(TLM_VERSION_PRERELEASE);
|
||||
const std::string tlm_version_release_date(TLM_VERSION_STRING_RELEASE_DATE);
|
||||
const std::string tlm_copyright_string(TLM_COPYRIGHT);
|
||||
const std::string tlm_version_string_2(TLM_VERSION_STRING_2);
|
||||
|
||||
inline const char*
|
||||
tlm_release
|
||||
( void
|
||||
)
|
||||
{
|
||||
return tlm_version_string.c_str ();
|
||||
}
|
||||
|
||||
inline const char*
|
||||
tlm_version
|
||||
( void
|
||||
)
|
||||
{
|
||||
return tlm_version_string_2.c_str ();
|
||||
}
|
||||
|
||||
inline const char*
|
||||
tlm_copyright
|
||||
( void
|
||||
)
|
||||
{
|
||||
return tlm_copyright_string.c_str ();
|
||||
}
|
||||
inline const char *tlm_release() { return tlm_version_string.c_str(); }
|
||||
inline const char *tlm_version() { return tlm_version_string_2.c_str(); }
|
||||
inline const char *tlm_copyright() { return tlm_copyright_string.c_str(); }
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
#endif /* __TLM_VERSION_H__ */
|
||||
#endif /* __SYSTEMC_EXT_TLM_CORE_TLM_2_TLM_VERSION_H__ */
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
## ****************************************************************************
|
||||
##
|
||||
## Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
|
||||
## more contributor license agreements. See the NOTICE file distributed
|
||||
## with this work for additional information regarding copyright ownership.
|
||||
## Accellera licenses this file to you under the Apache License, Version 2.0
|
||||
## (the "License"); you may not use this file except in compliance with the
|
||||
## License. You may obtain a copy of the License at
|
||||
##
|
||||
## http://www.apache.org/licenses/LICENSE-2.0
|
||||
##
|
||||
## Unless required by applicable law or agreed to in writing, software
|
||||
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
## implied. See the License for the specific language governing
|
||||
## permissions and limitations under the License.
|
||||
##
|
||||
## ****************************************************************************
|
||||
##
|
||||
## src/tlm_utils/Makefile.am --
|
||||
## Process this file with automake to produce a Makefile.in file.
|
||||
##
|
||||
## Original Author: Alan Fitch, Doulos, 2012-03-10
|
||||
##
|
||||
## ****************************************************************************
|
||||
##
|
||||
## MODIFICATION LOG - modifiers, enter your name, affiliation, date and
|
||||
## changes you are making here.
|
||||
##
|
||||
## Name, Affiliation, Date:
|
||||
## Description of Modification:
|
||||
##
|
||||
## ****************************************************************************
|
||||
|
||||
include $(top_srcdir)/config/Make-rules.sysc
|
||||
|
||||
H_FILES = \
|
||||
convenience_socket_bases.h \
|
||||
instance_specific_extensions.h \
|
||||
instance_specific_extensions_int.h \
|
||||
multi_passthrough_initiator_socket.h \
|
||||
multi_passthrough_target_socket.h \
|
||||
multi_socket_bases.h \
|
||||
passthrough_target_socket.h \
|
||||
peq_with_cb_and_phase.h \
|
||||
peq_with_get.h \
|
||||
simple_initiator_socket.h \
|
||||
simple_target_socket.h \
|
||||
tlm_quantumkeeper.h
|
||||
|
||||
CXX_FILES = \
|
||||
convenience_socket_bases.cpp \
|
||||
instance_specific_extensions.cpp
|
||||
|
||||
EXTRA_DIST += \
|
||||
README.txt
|
||||
|
||||
localincludedir = $(includedir)/tlm_utils
|
||||
nobase_localinclude_HEADERS = $(H_FILES)
|
||||
|
||||
noinst_LTLIBRARIES = libtlm_utils.la
|
||||
libtlm_utils_la_SOURCES = $(NO_H_FILES) $(CXX_FILES)
|
||||
@@ -1,731 +0,0 @@
|
||||
# Makefile.in generated by automake 1.14 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
# top-level SystemC include directory is added in Make-rules.{sysc,examples}
|
||||
|
||||
# build flags
|
||||
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
||||
am__make_running_with_option = \
|
||||
case $${target_option-} in \
|
||||
?) ;; \
|
||||
*) echo "am__make_running_with_option: internal error: invalid" \
|
||||
"target option '$${target_option-}' specified" >&2; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
has_opt=no; \
|
||||
sane_makeflags=$$MAKEFLAGS; \
|
||||
if $(am__is_gnu_make); then \
|
||||
sane_makeflags=$$MFLAGS; \
|
||||
else \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
bs=\\; \
|
||||
sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
|
||||
| sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
|
||||
esac; \
|
||||
fi; \
|
||||
skip_next=no; \
|
||||
strip_trailopt () \
|
||||
{ \
|
||||
flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
|
||||
}; \
|
||||
for flg in $$sane_makeflags; do \
|
||||
test $$skip_next = yes && { skip_next=no; continue; }; \
|
||||
case $$flg in \
|
||||
*=*|--*) continue;; \
|
||||
-*I) strip_trailopt 'I'; skip_next=yes;; \
|
||||
-*I?*) strip_trailopt 'I';; \
|
||||
-*O) strip_trailopt 'O'; skip_next=yes;; \
|
||||
-*O?*) strip_trailopt 'O';; \
|
||||
-*l) strip_trailopt 'l'; skip_next=yes;; \
|
||||
-*l?*) strip_trailopt 'l';; \
|
||||
-[dEDm]) skip_next=yes;; \
|
||||
-[JT]) skip_next=yes;; \
|
||||
esac; \
|
||||
case $$flg in \
|
||||
*$$target_option*) has_opt=yes; break;; \
|
||||
esac; \
|
||||
done; \
|
||||
test $$has_opt = yes
|
||||
am__make_dryrun = (target_option=n; $(am__make_running_with_option))
|
||||
am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
target_triplet = @target@
|
||||
DIST_COMMON = $(top_srcdir)/config/Make-rules.sysc \
|
||||
$(top_srcdir)/config/Make-rules.common $(srcdir)/Makefile.in \
|
||||
$(srcdir)/Makefile.am $(top_srcdir)/config/depcomp \
|
||||
$(nobase_localinclude_HEADERS)
|
||||
@WANT_DEBUG_TRUE@am__append_1 = $(DEBUG_CXXFLAGS)
|
||||
@WANT_DEBUG_TRUE@am__append_2 = $(DEBUG_CXXFLAGS)
|
||||
@WANT_DEBUG_TRUE@am__append_3 = $(DEBUG_CXXFLAGS)
|
||||
@WANT_OPTIMIZE_TRUE@am__append_4 = $(OPT_CXXFLAGS)
|
||||
@WANT_OPTIMIZE_TRUE@am__append_5 = $(OPT_CXXFLAGS)
|
||||
|
||||
# either for async_update locking or pthread processes
|
||||
@USES_PTHREADS_LIB_TRUE@am__append_6 = $(PTHREAD_CFLAGS)
|
||||
@USES_PTHREADS_LIB_TRUE@am__append_7 = $(PTHREAD_CFLAGS)
|
||||
@USES_PTHREADS_LIB_TRUE@am__append_8 = $(PTHREAD_LIBS)
|
||||
@DISABLE_ASYNC_UPDATES_TRUE@am__append_9 = -DSC_DISABLE_ASYNC_UPDATES
|
||||
@ENABLE_CALLBACKS_TRUE@am__append_10 = -DSC_ENABLE_SIMULATION_PHASE_CALLBACKS
|
||||
@ENABLE_CALLBACKS_TRACING_TRUE@am__append_11 = -DSC_ENABLE_SIMULATION_PHASE_CALLBACKS_TRACING
|
||||
@WANT_PTHREADS_THREADS_TRUE@am__append_12 = -DSC_USE_PTHREADS
|
||||
@DISABLE_VCD_SCOPES_TRUE@am__append_13 = -DSC_DISABLE_VCD_SCOPES
|
||||
subdir = src/tlm_utils
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/config/ax_check_define.m4 \
|
||||
$(top_srcdir)/config/ax_pthread.m4 \
|
||||
$(top_srcdir)/config/libtool.m4 \
|
||||
$(top_srcdir)/config/ltoptions.m4 \
|
||||
$(top_srcdir)/config/ltsugar.m4 \
|
||||
$(top_srcdir)/config/ltversion.m4 \
|
||||
$(top_srcdir)/config/lt~obsolete.m4 $(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
||||
libtlm_utils_la_LIBADD =
|
||||
am__objects_1 = convenience_socket_bases.lo \
|
||||
instance_specific_extensions.lo
|
||||
am_libtlm_utils_la_OBJECTS = $(am__objects_1)
|
||||
libtlm_utils_la_OBJECTS = $(am_libtlm_utils_la_OBJECTS)
|
||||
AM_V_lt = $(am__v_lt_@AM_V@)
|
||||
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
|
||||
am__v_lt_0 = --silent
|
||||
am__v_lt_1 =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@
|
||||
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
|
||||
am__depfiles_maybe = depfiles
|
||||
am__mv = mv -f
|
||||
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
|
||||
LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
|
||||
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
|
||||
$(AM_CXXFLAGS) $(CXXFLAGS)
|
||||
AM_V_CXX = $(am__v_CXX_@AM_V@)
|
||||
am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
|
||||
am__v_CXX_0 = @echo " CXX " $@;
|
||||
am__v_CXX_1 =
|
||||
CXXLD = $(CXX)
|
||||
CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
|
||||
$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
|
||||
am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
|
||||
am__v_CXXLD_0 = @echo " CXXLD " $@;
|
||||
am__v_CXXLD_1 =
|
||||
SOURCES = $(libtlm_utils_la_SOURCES)
|
||||
DIST_SOURCES = $(libtlm_utils_la_SOURCES)
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
*) f=$$p;; \
|
||||
esac;
|
||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||
am__install_max = 40
|
||||
am__nobase_strip_setup = \
|
||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||
am__nobase_strip = \
|
||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||
am__nobase_list = $(am__nobase_strip_setup); \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||
if (++n[$$2] == $(am__install_max)) \
|
||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||
END { for (dir in files) print dir, files[dir] }'
|
||||
am__base_list = \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||
am__uninstall_files_from_dir = { \
|
||||
test -z "$$files" \
|
||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(localincludedir)"
|
||||
HEADERS = $(nobase_localinclude_HEADERS)
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
am__uniquify_input = $(AWK) '\
|
||||
BEGIN { nonempty = 0; } \
|
||||
{ items[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in items) print i; }; } \
|
||||
'
|
||||
# Make sure the list of sources is unique. This is necessary because,
|
||||
# e.g., the same source file might be shared among _SOURCES variables
|
||||
# for different programs/libraries.
|
||||
am__define_uniq_tagged_files = \
|
||||
list='$(am__tagged_files)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCAS = @CCAS@
|
||||
CCASDEPMODE = @CCASDEPMODE@
|
||||
CCASFLAGS = @CCASFLAGS@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CFLAGS = @CFLAGS@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CXX = @CXX@
|
||||
CXXCPP = @CXXCPP@
|
||||
CXXDEPMODE = @CXXDEPMODE@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEBUG_CXXFLAGS = @DEBUG_CXXFLAGS@
|
||||
DEFS = $(PKGCONFIG_DEFINES) $(EXTRA_DEFINES)
|
||||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
DUMPBIN = @DUMPBIN@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXPLICIT_LPTHREAD = @EXPLICIT_LPTHREAD@
|
||||
EXTRA_ASFLAGS = @EXTRA_ASFLAGS@
|
||||
EXTRA_CFLAGS = @EXTRA_CFLAGS@
|
||||
EXTRA_CXXFLAGS = @EXTRA_CXXFLAGS@
|
||||
EXTRA_LDFLAGS = @EXTRA_LDFLAGS@
|
||||
FGREP = @FGREP@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LDFLAG_RPATH = @LDFLAG_RPATH@
|
||||
LIBCONFIG_DEFINES = @LIBCONFIG_DEFINES@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIB_ARCH_SUFFIX = @LIB_ARCH_SUFFIX@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OPT_CXXFLAGS = @OPT_CXXFLAGS@
|
||||
OTOOL = @OTOOL@
|
||||
OTOOL64 = @OTOOL64@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
PKGCONFIG_CFLAGS = @PKGCONFIG_CFLAGS@
|
||||
PKGCONFIG_DEFINES = @PKGCONFIG_DEFINES@
|
||||
PKGCONFIG_LDPRIV = @PKGCONFIG_LDPRIV@
|
||||
PTHREAD_CC = @PTHREAD_CC@
|
||||
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
|
||||
PTHREAD_LIBS = @PTHREAD_LIBS@
|
||||
QT_ARCH = @QT_ARCH@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
TARGET_ARCH = @TARGET_ARCH@
|
||||
TLM_PACKAGE_VERSION = @TLM_PACKAGE_VERSION@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_CXX = @ac_ct_CXX@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
ax_pthread_config = @ax_pthread_config@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
dvidir = @dvidir@
|
||||
examplesdir = @examplesdir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libarchdir = @libarchdir@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
rootdocdir = @rootdocdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
sysconfdir = @sysconfdir@
|
||||
target = @target@
|
||||
target_alias = @target_alias@
|
||||
target_cpu = @target_cpu@
|
||||
target_os = @target_os@
|
||||
target_vendor = @target_vendor@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src
|
||||
AM_CFLAGS = $(EXTRA_CFLAGS) $(am__append_2) $(am__append_5) \
|
||||
$(am__append_7)
|
||||
AM_CXXFLAGS = $(EXTRA_CXXFLAGS) $(am__append_1) $(am__append_4) \
|
||||
$(am__append_6)
|
||||
AM_CCASFLAGS = $(EXTRA_ASFLAGS) $(am__append_3)
|
||||
AM_LDFLAGS = $(EXTRA_LDFLAGS) $(am__append_8)
|
||||
|
||||
# always add fix-point support
|
||||
EXTRA_DEFINES = -DSC_INCLUDE_FX -DSC_BUILD $(am__append_9) \
|
||||
$(am__append_10) $(am__append_11) $(am__append_12) \
|
||||
$(am__append_13)
|
||||
|
||||
# initialize some useful variables (filled later)
|
||||
CLEANFILES =
|
||||
EXTRA_DIST = README.txt
|
||||
H_FILES = \
|
||||
convenience_socket_bases.h \
|
||||
instance_specific_extensions.h \
|
||||
instance_specific_extensions_int.h \
|
||||
multi_passthrough_initiator_socket.h \
|
||||
multi_passthrough_target_socket.h \
|
||||
multi_socket_bases.h \
|
||||
passthrough_target_socket.h \
|
||||
peq_with_cb_and_phase.h \
|
||||
peq_with_get.h \
|
||||
simple_initiator_socket.h \
|
||||
simple_target_socket.h \
|
||||
tlm_quantumkeeper.h
|
||||
|
||||
CXX_FILES = \
|
||||
convenience_socket_bases.cpp \
|
||||
instance_specific_extensions.cpp
|
||||
|
||||
localincludedir = $(includedir)/tlm_utils
|
||||
nobase_localinclude_HEADERS = $(H_FILES)
|
||||
noinst_LTLIBRARIES = libtlm_utils.la
|
||||
libtlm_utils_la_SOURCES = $(NO_H_FILES) $(CXX_FILES)
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .cpp .lo .o .obj
|
||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/config/Make-rules.sysc $(top_srcdir)/config/Make-rules.common $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/tlm_utils/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --foreign src/tlm_utils/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
$(top_srcdir)/config/Make-rules.sysc $(top_srcdir)/config/Make-rules.common:
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
clean-noinstLTLIBRARIES:
|
||||
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
|
||||
@list='$(noinst_LTLIBRARIES)'; \
|
||||
locs=`for p in $$list; do echo $$p; done | \
|
||||
sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
|
||||
sort -u`; \
|
||||
test -z "$$locs" || { \
|
||||
echo rm -f $${locs}; \
|
||||
rm -f $${locs}; \
|
||||
}
|
||||
|
||||
libtlm_utils.la: $(libtlm_utils_la_OBJECTS) $(libtlm_utils_la_DEPENDENCIES) $(EXTRA_libtlm_utils_la_DEPENDENCIES)
|
||||
$(AM_V_CXXLD)$(CXXLINK) $(libtlm_utils_la_OBJECTS) $(libtlm_utils_la_LIBADD) $(LIBS)
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.$(OBJEXT)
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convenience_socket_bases.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instance_specific_extensions.Plo@am__quote@
|
||||
|
||||
.cpp.o:
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
||||
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
|
||||
@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
|
||||
|
||||
.cpp.obj:
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
|
||||
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
|
||||
@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
|
||||
.cpp.lo:
|
||||
@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
|
||||
@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
|
||||
@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
install-nobase_localincludeHEADERS: $(nobase_localinclude_HEADERS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(nobase_localinclude_HEADERS)'; test -n "$(localincludedir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(localincludedir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(localincludedir)" || exit 1; \
|
||||
fi; \
|
||||
$(am__nobase_list) | while read dir files; do \
|
||||
xfiles=; for file in $$files; do \
|
||||
if test -f "$$file"; then xfiles="$$xfiles $$file"; \
|
||||
else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \
|
||||
test -z "$$xfiles" || { \
|
||||
test "x$$dir" = x. || { \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(localincludedir)/$$dir'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(localincludedir)/$$dir"; }; \
|
||||
echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(localincludedir)/$$dir'"; \
|
||||
$(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(localincludedir)/$$dir" || exit $$?; }; \
|
||||
done
|
||||
|
||||
uninstall-nobase_localincludeHEADERS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(nobase_localinclude_HEADERS)'; test -n "$(localincludedir)" || list=; \
|
||||
$(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \
|
||||
dir='$(DESTDIR)$(localincludedir)'; $(am__uninstall_files_from_dir)
|
||||
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-am
|
||||
TAGS: tags
|
||||
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
if test $$# -gt 0; then \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
"$$@" $$unique; \
|
||||
else \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: ctags-am
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscopelist: cscopelist-am
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
case "$(srcdir)" in \
|
||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||
esac; \
|
||||
for i in $$list; do \
|
||||
if test -f "$$i"; then \
|
||||
echo "$(subdir)/$$i"; \
|
||||
else \
|
||||
echo "$$sdir/$$i"; \
|
||||
fi; \
|
||||
done >> $(top_builddir)/cscope.files
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(LTLIBRARIES) $(HEADERS)
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(localincludedir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
|
||||
mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-compile distclean-generic \
|
||||
distclean-tags
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-am
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-nobase_localincludeHEADERS
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-am
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-am
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -rf ./$(DEPDIR)
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
||||
mostlyclean-libtool
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-nobase_localincludeHEADERS
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
|
||||
clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
|
||||
ctags-am distclean distclean-compile distclean-generic \
|
||||
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
||||
html-am info info-am install install-am install-data \
|
||||
install-data-am install-dvi install-dvi-am install-exec \
|
||||
install-exec-am install-html install-html-am install-info \
|
||||
install-info-am install-man install-nobase_localincludeHEADERS \
|
||||
install-pdf install-pdf-am install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
maintainer-clean maintainer-clean-generic mostlyclean \
|
||||
mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
|
||||
pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
|
||||
uninstall-nobase_localincludeHEADERS
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
@@ -16,62 +16,73 @@
|
||||
permissions and limitations under the License.
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef TLM_UTILS_CONVENIENCE_SOCKET_BASES_H_INCLUDED_
|
||||
#define TLM_UTILS_CONVENIENCE_SOCKET_BASES_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_CONVENIENCE_SOCKET_BASES_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_CONVENIENCE_SOCKET_BASES_H__
|
||||
|
||||
#include <sysc/kernel/sc_cmnhdr.h>
|
||||
#include <systemc>
|
||||
|
||||
namespace sc_core { class SC_API sc_object; }
|
||||
|
||||
namespace tlm_utils {
|
||||
|
||||
// implementation-defined base class helper for convenience sockets
|
||||
class SC_API convenience_socket_base
|
||||
namespace sc_core
|
||||
{
|
||||
public:
|
||||
void display_warning(const char* msg) const;
|
||||
void display_error(const char* msg) const;
|
||||
protected:
|
||||
virtual ~convenience_socket_base(){}
|
||||
private:
|
||||
virtual const char* get_report_type() const = 0;
|
||||
virtual const sc_core::sc_object* get_socket() const = 0;
|
||||
|
||||
class sc_object;
|
||||
|
||||
} // namespace sc_core
|
||||
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
// Implementation-defined base class helper for convenience sockets.
|
||||
class convenience_socket_base
|
||||
{
|
||||
public:
|
||||
void display_warning(const char *msg) const;
|
||||
void display_error(const char *msg) const;
|
||||
|
||||
protected:
|
||||
virtual ~convenience_socket_base() {}
|
||||
|
||||
private:
|
||||
virtual const char *get_report_type() const = 0;
|
||||
virtual const sc_core::sc_object *get_socket() const = 0;
|
||||
};
|
||||
|
||||
// implementation-defined base class helper for simple sockets
|
||||
class SC_API simple_socket_base : public convenience_socket_base
|
||||
// Implementation-defined base class helper for simple sockets.
|
||||
class simple_socket_base : public convenience_socket_base
|
||||
{
|
||||
virtual const char* get_report_type() const;
|
||||
protected:
|
||||
void elaboration_check(const char* action) const;
|
||||
virtual const char *get_report_type() const;
|
||||
|
||||
protected:
|
||||
void elaboration_check(const char *action) const;
|
||||
};
|
||||
|
||||
// implementation-defined base class helper for passthrough sockets
|
||||
class SC_API passthrough_socket_base : public convenience_socket_base
|
||||
// Implementation-defined base class helper for passthrough sockets.
|
||||
class passthrough_socket_base : public convenience_socket_base
|
||||
{
|
||||
virtual const char* get_report_type() const;
|
||||
virtual const char *get_report_type() const;
|
||||
};
|
||||
|
||||
// implementation-defined base class helper for multi sockets
|
||||
class SC_API multi_socket_base : public convenience_socket_base
|
||||
// Implementation-defined base class helper for multi sockets.
|
||||
class multi_socket_base : public convenience_socket_base
|
||||
{
|
||||
virtual const char* get_report_type() const;
|
||||
virtual const char *get_report_type() const;
|
||||
};
|
||||
|
||||
// implementation-defined base class for callback helpers
|
||||
class SC_API convenience_socket_cb_holder
|
||||
// Implementation-defined base class for callback helpers.
|
||||
class convenience_socket_cb_holder
|
||||
{
|
||||
public:
|
||||
void display_warning(const char* msg) const;
|
||||
void display_error(const char* msg) const;
|
||||
public:
|
||||
void display_warning(const char *msg) const;
|
||||
void display_error(const char *msg) const;
|
||||
|
||||
protected:
|
||||
explicit convenience_socket_cb_holder(convenience_socket_base* owner)
|
||||
: m_owner(owner) {}
|
||||
protected:
|
||||
explicit convenience_socket_cb_holder(convenience_socket_base *owner) :
|
||||
m_owner(owner)
|
||||
{}
|
||||
|
||||
private:
|
||||
convenience_socket_base* m_owner;
|
||||
private:
|
||||
convenience_socket_base *m_owner;
|
||||
};
|
||||
|
||||
} // namespace tlm_utils
|
||||
#endif // TLM_UTILS_CONVENIENCE_SOCKET_BASES_H_INCLUDED_
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_CONVENIENCE_SOCKET_BASES_H__ */
|
||||
|
||||
@@ -16,26 +16,25 @@
|
||||
permissions and limitations under the License.
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
Instance specific extensions, are extension that only a single instance of a module
|
||||
may access. They are invisible to all other modules; they are private to this
|
||||
instance so to speak.
|
||||
|
||||
As they are only of value to a certain instance, this instance knows very well
|
||||
when it needs them and when it does not need them any longer (usually when
|
||||
a transaction passes through a module for the last time).
|
||||
It does not have to care if anyone else in the system may still have a
|
||||
reference to the transaction as this one is not able to access the extension
|
||||
anyway.
|
||||
/*
|
||||
Instance specific extensions, are extension that only a single instance of a
|
||||
module may access. They are invisible to all other modules; they are private
|
||||
to this instance so to speak.
|
||||
|
||||
As they are only of value to a certain instance, this instance knows very
|
||||
well when it needs them and when it does not need them any longer (usually
|
||||
when a transaction passes through a module for the last time). It does not
|
||||
have to care if anyone else in the system may still have a reference to the
|
||||
transaction as this one is not able to access the extension anyway.
|
||||
Therefore the instance is obliged to call set_extension when it wants to add a
|
||||
private extension and clear_extension when it does not need it any more.
|
||||
|
||||
To get access to an instance specifc extension the module must own a so called
|
||||
instance_specific_extension_accessor that provides the exclusive access rights.
|
||||
Assuming the instance_specific_extension_accessor of a given module is called m_accessor
|
||||
and the transaction of which the private extension is about to be accessed
|
||||
is called txn, then the calls have to be
|
||||
Assuming the instance_specific_extension_accessor of a given module is called
|
||||
m_accessor and the transaction of which the private extension is about to be
|
||||
accessed is called txn, then the calls have to be
|
||||
|
||||
m_accessor(txn).set_extension(...);
|
||||
or
|
||||
@@ -44,81 +43,86 @@ m_accessor(txn).clear_extension(...);
|
||||
The owner of the private extension is responsible to allocate/deallocate
|
||||
the extension before/after setting/clearing the extension.
|
||||
*/
|
||||
|
||||
#ifndef TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_H_INCLUDED_
|
||||
#define TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_H_INCLUDED_
|
||||
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_H__
|
||||
|
||||
#include "tlm_utils/instance_specific_extensions_int.h"
|
||||
|
||||
namespace tlm_utils {
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
//The templated private extension. Similar to normal extension
|
||||
// The templated private extension. Similar to normal extension.
|
||||
template <typename T>
|
||||
class instance_specific_extension : public ispex_base {
|
||||
public:
|
||||
class instance_specific_extension : public ispex_base
|
||||
{
|
||||
public:
|
||||
virtual ~instance_specific_extension() {}
|
||||
const static unsigned int priv_id;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
const unsigned int instance_specific_extension<T>::priv_id
|
||||
= ispex_base::register_private_extension(typeid(T));
|
||||
const unsigned int instance_specific_extension<T>::priv_id =
|
||||
ispex_base::register_private_extension(typeid(T));
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// This is the class that actually sits in the extension array
|
||||
// - we keep this small since that one gets allocated and deallocated all the times
|
||||
// - we keep the implementation in the header to avoid registration
|
||||
// of the extension itself unless used in the model
|
||||
class instance_specific_extension_carrier
|
||||
: public tlm::tlm_extension<instance_specific_extension_carrier>
|
||||
// - We keep this small since that one gets allocated and deallocated all
|
||||
// the times.
|
||||
// - We keep the implementation in the header to avoid registration
|
||||
// of the extension itself unless used in the model.
|
||||
class instance_specific_extension_carrier :
|
||||
public tlm::tlm_extension<instance_specific_extension_carrier>
|
||||
{
|
||||
friend class instance_specific_extension_accessor;
|
||||
public:
|
||||
instance_specific_extension_carrier()
|
||||
: m_container()
|
||||
{}
|
||||
friend class instance_specific_extension_accessor;
|
||||
public:
|
||||
instance_specific_extension_carrier() : m_container() {}
|
||||
|
||||
virtual tlm::tlm_extension_base* clone() const {
|
||||
//we don't clone since private info is instance specific and associated to a given txn (the original)
|
||||
//so the deep copied txn will be virgin in terms of private info
|
||||
return NULL;
|
||||
}
|
||||
virtual tlm::tlm_extension_base *
|
||||
clone() const
|
||||
{
|
||||
// We don't clone since private info is instance specific and
|
||||
// associated to a given txn (the original) so the deep copied txn
|
||||
// will be virgin in terms of private info.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void copy_from(tlm::tlm_extension_base const &) { return; }
|
||||
void free() { return; }
|
||||
void copy_from(tlm::tlm_extension_base const &) { return; }
|
||||
void free() { return; }
|
||||
|
||||
private:
|
||||
instance_specific_extension_container* m_container;
|
||||
private:
|
||||
instance_specific_extension_container *m_container;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
template<typename T>
|
||||
instance_specific_extensions_per_accessor&
|
||||
instance_specific_extension_accessor::operator()(T& txn)
|
||||
template <typename T>
|
||||
instance_specific_extensions_per_accessor &
|
||||
instance_specific_extension_accessor::operator () (T &txn)
|
||||
{
|
||||
instance_specific_extension_carrier* carrier = NULL;
|
||||
txn.get_extension(carrier);
|
||||
if (!carrier) {
|
||||
carrier = new instance_specific_extension_carrier();
|
||||
carrier->m_container = instance_specific_extension_container::create();
|
||||
carrier->m_container->attach_carrier(carrier, &txn, &release_carrier<T>);
|
||||
txn.set_extension(carrier);
|
||||
}
|
||||
return *carrier->m_container->get_accessor(m_index);
|
||||
instance_specific_extension_carrier *carrier = NULL;
|
||||
txn.get_extension(carrier);
|
||||
if (!carrier) {
|
||||
carrier = new instance_specific_extension_carrier();
|
||||
carrier->m_container = instance_specific_extension_container::create();
|
||||
carrier->m_container->attach_carrier(
|
||||
carrier, &txn, &release_carrier<T>);
|
||||
txn.set_extension(carrier);
|
||||
}
|
||||
return *carrier->m_container->get_accessor(m_index);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
template <typename T>
|
||||
void
|
||||
instance_specific_extension_accessor::
|
||||
release_carrier(instance_specific_extension_carrier* carrier, void* txn)
|
||||
instance_specific_extension_accessor::release_carrier(
|
||||
instance_specific_extension_carrier *carrier, void *txn)
|
||||
{
|
||||
T* typed_txn = static_cast<T*>(txn);
|
||||
typed_txn->clear_extension(carrier);
|
||||
delete carrier;
|
||||
T *typed_txn = static_cast<T *>(txn);
|
||||
typed_txn->clear_extension(carrier);
|
||||
delete carrier;
|
||||
}
|
||||
|
||||
} // namespace tlm_utils
|
||||
|
||||
#endif // TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_H_INCLUDED_
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_H__ */
|
||||
|
||||
@@ -16,159 +16,167 @@
|
||||
permissions and limitations under the License.
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_INT_H_INCLUDED_
|
||||
#define TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_INT_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_INT_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_INT_H__
|
||||
|
||||
#ifndef SC_BUILD // incluce full TLM, when not building the library
|
||||
#include <tlm>
|
||||
#else
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_gp.h"
|
||||
#endif // SC_BUILD
|
||||
|
||||
namespace tlm_utils {
|
||||
class SC_API ispex_base;
|
||||
class SC_API instance_specific_extension_accessor;
|
||||
class SC_API instance_specific_extension_container;
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
class ispex_base;
|
||||
class instance_specific_extension_accessor;
|
||||
class instance_specific_extension_container;
|
||||
class instance_specific_extension_carrier;
|
||||
class instance_specific_extension_container_pool;
|
||||
}
|
||||
|
||||
namespace tlm {
|
||||
SC_API_TEMPLATE_DECL_ tlm_array<tlm_utils::ispex_base*>;
|
||||
} // namespace tlm_utils
|
||||
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
extern template class tlm_array<tlm_utils::ispex_base *>;
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
namespace tlm_utils {
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
//The private extension base. Similar to normal extension base, but without clone and free
|
||||
class SC_API ispex_base
|
||||
// The private extension base. Similar to normal extension base, but without
|
||||
// clone and free.
|
||||
class ispex_base
|
||||
{
|
||||
friend class tlm::tlm_array<ispex_base*>;
|
||||
void free() {} // needed for explicit tlm_array instantiation
|
||||
public:
|
||||
void free() {} // Needed for explicit tlm_array instantiation.
|
||||
|
||||
public:
|
||||
virtual ~ispex_base() {}
|
||||
protected:
|
||||
static unsigned int register_private_extension(const std::type_info&);
|
||||
|
||||
protected:
|
||||
static unsigned int register_private_extension(const std::type_info &);
|
||||
};
|
||||
|
||||
//this thing is basically a snippet of the generic_payload
|
||||
// it contains all the extension specific code (the extension API so to speak)
|
||||
// This thing is basically a snippet of the generic_payload.
|
||||
// It contains all the extension specific code (the extension API so to speak)
|
||||
// the differences are:
|
||||
// - it calls back to its owner whenever a real (==non-NULL) extension gets set for the first time
|
||||
// - it calls back to its owner whenever a living (==non-NULL) extension gets cleared
|
||||
class SC_API instance_specific_extensions_per_accessor
|
||||
// - it calls back to its owner whenever a real (==non-NULL) extension gets
|
||||
// set for the first time.
|
||||
// - it calls back to its owner whenever a living (==non-NULL) extension gets
|
||||
// cleared.
|
||||
class instance_specific_extensions_per_accessor
|
||||
{
|
||||
public:
|
||||
typedef instance_specific_extension_container container_type;
|
||||
public:
|
||||
typedef instance_specific_extension_container container_type;
|
||||
|
||||
explicit
|
||||
instance_specific_extensions_per_accessor(container_type* container)
|
||||
: m_container(container)
|
||||
{}
|
||||
explicit
|
||||
instance_specific_extensions_per_accessor(container_type *container) :
|
||||
m_container(container)
|
||||
{}
|
||||
|
||||
template <typename T> T* set_extension(T* ext)
|
||||
{
|
||||
return static_cast<T*>( set_extension(T::priv_id, ext) );
|
||||
}
|
||||
template <typename T>
|
||||
T *
|
||||
set_extension(T *ext)
|
||||
{
|
||||
return static_cast<T *>(set_extension(T::priv_id, ext));
|
||||
}
|
||||
|
||||
// non-templatized version with manual index:
|
||||
ispex_base* set_extension(unsigned int index, ispex_base* ext);
|
||||
// Non-templatized version with manual index:
|
||||
ispex_base *set_extension(unsigned int index, ispex_base *ext);
|
||||
|
||||
// Check for an extension, ext will point to 0 if not present
|
||||
template <typename T> void get_extension(T*& ext) const
|
||||
{
|
||||
ext = static_cast<T*>(get_extension(T::priv_id));
|
||||
}
|
||||
// Non-templatized version:
|
||||
ispex_base* get_extension(unsigned int index) const;
|
||||
// Check for an extension, ext will be nullptr if not present.
|
||||
template <typename T>
|
||||
void get_extension(T *& ext) const
|
||||
{
|
||||
ext = static_cast<T *>(get_extension(T::priv_id));
|
||||
}
|
||||
// Non-templatized version:
|
||||
ispex_base *get_extension(unsigned int index) const;
|
||||
|
||||
// Clear extension, the argument is needed to find the right index:
|
||||
template <typename T> void clear_extension(const T*)
|
||||
{
|
||||
clear_extension(T::priv_id);
|
||||
}
|
||||
// Clear extension, the argument is needed to find the right index:
|
||||
template <typename T>
|
||||
void clear_extension(const T *)
|
||||
{
|
||||
clear_extension(T::priv_id);
|
||||
}
|
||||
|
||||
// Non-templatized version with manual index
|
||||
void clear_extension(unsigned int index);
|
||||
// Non-templatized version with manual index
|
||||
void clear_extension(unsigned int index);
|
||||
|
||||
// Make sure the extension array is large enough. Can be called once by
|
||||
// an initiator module (before issuing the first transaction) to make
|
||||
// sure that the extension array is of correct size. This is only needed
|
||||
// if the initiator cannot guarantee that the generic payload object is
|
||||
// allocated after C++ static construction time.
|
||||
void resize_extensions();
|
||||
// Make sure the extension array is large enough. Can be called once by
|
||||
// an initiator module (before issuing the first transaction) to make
|
||||
// sure that the extension array is of correct size. This is only needed
|
||||
// if the initiator cannot guarantee that the generic payload object is
|
||||
// allocated after C++ static construction time.
|
||||
void resize_extensions();
|
||||
|
||||
private:
|
||||
tlm::tlm_array<ispex_base*> m_extensions;
|
||||
container_type* m_container;
|
||||
private:
|
||||
tlm::tlm_array<ispex_base *> m_extensions;
|
||||
container_type* m_container;
|
||||
};
|
||||
|
||||
}; // class instance_specific_extensions_per_accessor
|
||||
|
||||
#if defined(_MSC_VER) && !defined(SC_WIN_DLL_WARN)
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4251) // DLL import for vector
|
||||
#endif
|
||||
|
||||
//this thing contains the vector of extensions per accessor
|
||||
//which can be really large so this one should be pool allocated
|
||||
// therefore it keeps a use_count of itself to automatically free itself
|
||||
// This thing contains the vector of extensions per accessor
|
||||
// which can be really large so this one should be pool allocated.
|
||||
// Therefore it keeps a use_count of itself to automatically free itself.
|
||||
// - to this end it provides callbacks to the extensions per accessor
|
||||
// to increment and decrement the use_count
|
||||
class SC_API instance_specific_extension_container
|
||||
// to increment and decrement the use_count.
|
||||
class instance_specific_extension_container
|
||||
{
|
||||
friend class instance_specific_extension_accessor;
|
||||
friend class instance_specific_extension_carrier;
|
||||
friend class instance_specific_extension_container_pool;
|
||||
friend class instance_specific_extensions_per_accessor;
|
||||
friend class instance_specific_extension_accessor;
|
||||
friend class instance_specific_extension_carrier;
|
||||
friend class instance_specific_extension_container_pool;
|
||||
friend class instance_specific_extensions_per_accessor;
|
||||
|
||||
typedef void release_fn(instance_specific_extension_carrier*,void*);
|
||||
typedef void release_fn(instance_specific_extension_carrier *, void *);
|
||||
|
||||
instance_specific_extension_container();
|
||||
~instance_specific_extension_container();
|
||||
instance_specific_extension_container();
|
||||
~instance_specific_extension_container();
|
||||
|
||||
void resize();
|
||||
void resize();
|
||||
|
||||
void inc_use_count();
|
||||
void dec_use_count();
|
||||
void inc_use_count();
|
||||
void dec_use_count();
|
||||
|
||||
static instance_specific_extension_container* create();
|
||||
void attach_carrier(instance_specific_extension_carrier*, void* txn, release_fn*);
|
||||
static instance_specific_extension_container *create();
|
||||
void attach_carrier(
|
||||
instance_specific_extension_carrier *, void *txn, release_fn *);
|
||||
|
||||
instance_specific_extensions_per_accessor* get_accessor(unsigned int index);
|
||||
instance_specific_extensions_per_accessor *
|
||||
get_accessor(unsigned int index);
|
||||
|
||||
std::vector<instance_specific_extensions_per_accessor*> m_ispex_per_accessor;
|
||||
unsigned int use_count;
|
||||
void* m_txn;
|
||||
release_fn* m_release_fn;
|
||||
instance_specific_extension_carrier* m_carrier;
|
||||
instance_specific_extension_container* next; //for pooling
|
||||
|
||||
}; // class instance_specific_extension_container
|
||||
|
||||
#if defined(_MSC_VER) && !defined(SC_WIN_DLL_WARN)
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
std::vector<instance_specific_extensions_per_accessor *>
|
||||
m_ispex_per_accessor;
|
||||
unsigned int use_count;
|
||||
void *m_txn;
|
||||
release_fn *m_release_fn;
|
||||
instance_specific_extension_carrier *m_carrier;
|
||||
instance_specific_extension_container *next; // For pooling.
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
//This class 'hides' all the instance specific extension stuff from the user
|
||||
// he instantiates one of those (e.g. instance_specific_extension_accessor extAcc;) and can then access
|
||||
// the private extensions
|
||||
// This class 'hides' all the instance specific extension stuff from the user.
|
||||
// They instantiates one of those (e.g. instance_specific_extension_accessor
|
||||
// extAcc;) and can then access the private extensions.
|
||||
// extAcc(txn).extensionAPIFnCall()
|
||||
// where extensionAPIFnCall is set_extension, get_extension, clear_extension,...
|
||||
class SC_API instance_specific_extension_accessor
|
||||
// where extensionAPIFnCall is set_extension, get_extension,
|
||||
// clear_extension,...
|
||||
class instance_specific_extension_accessor
|
||||
{
|
||||
public:
|
||||
instance_specific_extension_accessor();
|
||||
public:
|
||||
instance_specific_extension_accessor();
|
||||
|
||||
template<typename T> // implementation in instance_specific_extensions.h
|
||||
inline instance_specific_extensions_per_accessor& operator()(T& txn);
|
||||
// Implementation in instance_specific_extensions.h
|
||||
template <typename T>
|
||||
inline instance_specific_extensions_per_accessor &operator () (T &txn);
|
||||
|
||||
protected:
|
||||
template<typename T>
|
||||
static void release_carrier(instance_specific_extension_carrier*, void* txn);
|
||||
protected:
|
||||
template<typename T>
|
||||
static void release_carrier(
|
||||
instance_specific_extension_carrier *, void * txn);
|
||||
|
||||
unsigned int m_index;
|
||||
}; // class instance_specific_extension_accessor
|
||||
unsigned int m_index;
|
||||
};
|
||||
|
||||
} // namespace tlm_utils
|
||||
#endif // TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_INT_H_INCLUDED_
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_INSTANCE_SPECIFIC_EXTENSIONS_INT_H__ */
|
||||
|
||||
@@ -16,12 +16,13 @@
|
||||
permissions and limitations under the License.
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef TLM_UTILS_MULTI_PASSTHROUGH_INITIATOR_SOCKET_H_INCLUDED_
|
||||
#define TLM_UTILS_MULTI_PASSTHROUGH_INITIATOR_SOCKET_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_MULTI_PASSTHROUGH_INITIATOR_SOCKET_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_MULTI_PASSTHROUGH_INITIATOR_SOCKET_H__
|
||||
|
||||
#include "multi_socket_bases.h"
|
||||
#include "tlm_utils/multi_socket_bases.h"
|
||||
|
||||
namespace tlm_utils {
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
/*
|
||||
This class implements a trivial multi initiator socket.
|
||||
@@ -34,253 +35,297 @@ he likes to use. The callbacks are basically equal to the bw interface
|
||||
methods but carry an additional integer that indicates to which
|
||||
index of this socket the calling target is connected.
|
||||
*/
|
||||
template <typename MODULE,
|
||||
unsigned int BUSWIDTH = 32,
|
||||
typename TYPES = tlm::tlm_base_protocol_types,
|
||||
unsigned int N=0, sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class multi_passthrough_initiator_socket
|
||||
: public multi_init_base< BUSWIDTH, TYPES, N, POL>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types, unsigned int N=0,
|
||||
sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class multi_passthrough_initiator_socket :
|
||||
public multi_init_base< BUSWIDTH, TYPES, N, POL>
|
||||
{
|
||||
public:
|
||||
public:
|
||||
|
||||
//typedefs
|
||||
// tlm 2.0 types for nb_transport
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
//typedefs
|
||||
// tlm 2.0 types for nb_transport
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
|
||||
// typedefs to keep the fn ptr notations short
|
||||
typedef sync_enum_type (MODULE::*nb_cb)(int,
|
||||
transaction_type&,
|
||||
phase_type&,
|
||||
sc_core::sc_time&);
|
||||
typedef void (MODULE::*dmi_cb)(int, sc_dt::uint64, sc_dt::uint64);
|
||||
// typedefs to keep the fn ptr notations short
|
||||
typedef sync_enum_type (MODULE::*nb_cb)(
|
||||
int, transaction_type &, phase_type &, sc_core::sc_time &);
|
||||
typedef void (MODULE::*dmi_cb)(int, sc_dt::uint64, sc_dt::uint64);
|
||||
|
||||
typedef multi_init_base<BUSWIDTH, TYPES, N, POL> base_type;
|
||||
typedef multi_init_base<BUSWIDTH, TYPES, N, POL> base_type;
|
||||
|
||||
typedef typename base_type::base_target_socket_type base_target_socket_type;
|
||||
typedef typename base_type::base_target_socket_type
|
||||
base_target_socket_type;
|
||||
|
||||
static const char* default_name()
|
||||
{ return sc_core::sc_gen_unique_name("multi_passthrough_initiator_socket"); }
|
||||
|
||||
//CTOR
|
||||
explicit multi_passthrough_initiator_socket(const char* name = default_name())
|
||||
: base_type(name)
|
||||
, m_hierarch_bind(0)
|
||||
, m_beoe_disabled(false)
|
||||
, m_dummy(this,42)
|
||||
{
|
||||
}
|
||||
|
||||
~multi_passthrough_initiator_socket(){
|
||||
//clean up everything allocated by 'new'
|
||||
for (unsigned int i=0; i<m_binders.size(); i++) delete m_binders[i];
|
||||
}
|
||||
|
||||
//register callback for nb transport of bw interface
|
||||
void register_nb_transport_bw(MODULE* mod,
|
||||
sync_enum_type (MODULE::*cb)(int,
|
||||
transaction_type&,
|
||||
phase_type&,
|
||||
sc_core::sc_time&))
|
||||
{
|
||||
//warn if there already is a callback
|
||||
if (m_nb_f.is_valid()){
|
||||
display_warning("NBTransport_bw callback already registered.");
|
||||
return;
|
||||
static const char *
|
||||
default_name()
|
||||
{
|
||||
return sc_core::sc_gen_unique_name(
|
||||
"multi_passthrough_initiator_socket");
|
||||
}
|
||||
|
||||
//set the functor
|
||||
m_nb_f.set_function(mod, cb);
|
||||
}
|
||||
explicit multi_passthrough_initiator_socket(
|
||||
const char *name=default_name()) :
|
||||
base_type(name), m_hierarch_bind(nullptr), m_beoe_disabled(false),
|
||||
m_dummy(this, 42)
|
||||
{}
|
||||
|
||||
//register callback for dmi function of bw interface
|
||||
void register_invalidate_direct_mem_ptr(MODULE* mod,
|
||||
void (MODULE::*cb)(int, sc_dt::uint64, sc_dt::uint64))
|
||||
{
|
||||
//warn if there already is a callback
|
||||
if (m_dmi_f.is_valid()){
|
||||
display_warning("InvalidateDMI callback already registered.");
|
||||
return;
|
||||
~multi_passthrough_initiator_socket()
|
||||
{
|
||||
// Clean up everything allocated by 'new'.
|
||||
for (unsigned int i = 0; i < m_binders.size(); i++)
|
||||
delete m_binders[i];
|
||||
}
|
||||
|
||||
//set the functor
|
||||
m_dmi_f.set_function(mod, cb);
|
||||
}
|
||||
// Register callback for nb transport of bw interface.
|
||||
void
|
||||
register_nb_transport_bw(MODULE *mod, sync_enum_type (MODULE::*cb)(
|
||||
int, transaction_type &, phase_type &, sc_core::sc_time &))
|
||||
{
|
||||
// Warn if there already is a callback.
|
||||
if (m_nb_f.is_valid()) {
|
||||
display_warning("NBTransport_bw callback already registered.");
|
||||
return;
|
||||
}
|
||||
|
||||
//Override virtual functions of the tlm_initiator_socket:
|
||||
// this function is called whenever an sc_port (as part of a target socket)
|
||||
// wants to bind to the export of the underlying tlm_initiator_socket
|
||||
//At this time a callback binder is created an returned to the sc_port
|
||||
// of the target socket, so that it binds to the callback binder
|
||||
virtual tlm::tlm_bw_transport_if<TYPES>& get_base_interface()
|
||||
{
|
||||
m_binders.push_back(new callback_binder_bw<TYPES>(this, m_binders.size()));
|
||||
return *m_binders[m_binders.size()-1];
|
||||
}
|
||||
|
||||
// const overload not allowed for multi-sockets
|
||||
virtual const tlm::tlm_bw_transport_if<TYPES>& get_base_interface() const
|
||||
{
|
||||
display_error("'get_base_interface()' const not allowed for multi-sockets.");
|
||||
return base_type::get_base_interface();
|
||||
}
|
||||
|
||||
//Override virtual functions of the tlm_initiator_socket:
|
||||
// this function is called whenever an sc_export (as part of a initiator socket)
|
||||
// wants to bind to the export of the underlying tlm_initiator_socket
|
||||
// i.e. a hierarchical bind takes place
|
||||
virtual sc_core::sc_export<tlm::tlm_bw_transport_if<TYPES> >& get_base_export()
|
||||
{
|
||||
if (!m_beoe_disabled) //we are not bound hierarchically
|
||||
base_type::m_export.bind(m_dummy); //so we bind the dummy to avoid a SystemC error
|
||||
return base_type::get_base_export(); //and then return our own export so that the hierarchical binding is set up properly
|
||||
}
|
||||
|
||||
virtual const sc_core::sc_export<tlm::tlm_bw_transport_if<TYPES> >& get_base_export() const
|
||||
{
|
||||
return base_type::get_base_export();
|
||||
}
|
||||
|
||||
//bind against a target socket
|
||||
virtual void bind(base_target_socket_type& s)
|
||||
{
|
||||
//error if this socket is already bound hierarchically
|
||||
if (m_hierarch_bind) {
|
||||
display_error("Already hierarchically bound.");
|
||||
return;
|
||||
// Set the functor.
|
||||
m_nb_f.set_function(mod, cb);
|
||||
}
|
||||
|
||||
base_type::bind(s); //satisfy systemC, leads to a call to get_base_interface()
|
||||
// Register callback for dmi function of bw interface.
|
||||
void
|
||||
register_invalidate_direct_mem_ptr(MODULE *mod, void (MODULE::*cb)(
|
||||
int, sc_dt::uint64, sc_dt::uint64))
|
||||
{
|
||||
// Warn if there already is a callback.
|
||||
if (m_dmi_f.is_valid()) {
|
||||
display_warning("InvalidateDMI callback already registered.");
|
||||
return;
|
||||
}
|
||||
|
||||
//try to cast the target socket into a fw interface
|
||||
sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >* p_ex_s=dynamic_cast<sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >*>(&s);
|
||||
if (!p_ex_s) {
|
||||
display_error("Multi socket not bound to tlm_socket.");
|
||||
return;
|
||||
// Set the functor.
|
||||
m_dmi_f.set_function(mod, cb);
|
||||
}
|
||||
|
||||
//try a cast into a multi sockets
|
||||
multi_to_multi_bind_base<TYPES>* test=dynamic_cast<multi_to_multi_bind_base<TYPES>*> (p_ex_s);
|
||||
if (test) //did we just do a multi-multi bind??
|
||||
//if that is the case the multi target socket must have just created a callback binder
|
||||
// which we want to get from it.
|
||||
//Moreover, we also just created one, which we will pass to it.
|
||||
m_sockets.push_back(test->get_last_binder(m_binders[m_binders.size()-1]));
|
||||
else{ // if not just bind normally
|
||||
sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >& ex_s=*p_ex_s;
|
||||
m_sockets.push_back(&((tlm::tlm_fw_transport_if<TYPES>&)ex_s)); //store the interface we are bound against
|
||||
}
|
||||
}
|
||||
|
||||
//operator notation for direct bind
|
||||
void operator() (base_target_socket_type& s)
|
||||
{
|
||||
bind(s);
|
||||
}
|
||||
|
||||
//SystemC standard callback before end of elaboration
|
||||
void before_end_of_elaboration(){
|
||||
//if our export hasn't been bound yet (due to a hierarch binding)
|
||||
// we bind it now to avoid a SystemC error.
|
||||
//We must do that, because it is legal not to register a callback on this socket
|
||||
// as the user might only use b_transport
|
||||
if (!base_type::m_export.get_interface()){
|
||||
base_type::m_export.bind(m_dummy);
|
||||
// Override virtual functions of the tlm_initiator_socket:
|
||||
// this function is called whenever an sc_port (as part of a target socket)
|
||||
// wants to bind to the export of the underlying tlm_initiator_socket.
|
||||
// At this time a callback binder is created an returned to the sc_port
|
||||
// of the target socket, so that it binds to the callback binder.
|
||||
virtual tlm::tlm_bw_transport_if<TYPES> &
|
||||
get_base_interface()
|
||||
{
|
||||
m_binders.push_back(
|
||||
new callback_binder_bw<TYPES>(this, m_binders.size()));
|
||||
return *m_binders[m_binders.size() - 1];
|
||||
}
|
||||
|
||||
//'break' here if the socket was told not to do callback binding
|
||||
if (m_beoe_disabled) return;
|
||||
|
||||
//get the callback binders of the top of the hierachical bind chain
|
||||
// NOTE: this could be the same socket if there is no hierachical bind
|
||||
std::vector<callback_binder_bw<TYPES>* >& binders=get_hierarch_bind()->get_binders();
|
||||
|
||||
//get the interfaces bound to the top of the hierachical bind chain
|
||||
// NOTE: this could be the same socket if there is no hierachical bind
|
||||
m_used_sockets=get_hierarch_bind()->get_sockets();
|
||||
|
||||
//register the callbacks of this socket with the callback binders
|
||||
// we just got from the top of the hierachical bind chain
|
||||
for (unsigned int i=0; i<binders.size(); i++) {
|
||||
binders[i]->set_callbacks(m_nb_f, m_dmi_f);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Bind multi initiator socket to multi initiator socket (hierarchical bind)
|
||||
//
|
||||
virtual void bind(base_type& s)
|
||||
{
|
||||
if (m_binders.size()) {
|
||||
//a multi socket is either bound hierarchically or directly
|
||||
display_error("Socket already directly bound.");
|
||||
return;
|
||||
}
|
||||
if (m_hierarch_bind){
|
||||
display_warning("Socket already bound hierarchically. Bind attempt ignored.");
|
||||
return;
|
||||
// Const overload not allowed for multi-sockets.
|
||||
virtual const tlm::tlm_bw_transport_if<TYPES> &
|
||||
get_base_interface() const
|
||||
{
|
||||
display_error("'get_base_interface()'"
|
||||
" const not allowed for multi-sockets.");
|
||||
return base_type::get_base_interface();
|
||||
}
|
||||
|
||||
//remember to which socket we are hierarchically bound and disable it,
|
||||
// so that it won't try to register callbacks itself
|
||||
s.disable_cb_bind();
|
||||
m_hierarch_bind=&s;
|
||||
base_type::bind(s); //satisfy SystemC
|
||||
}
|
||||
// Override virtual functions of the tlm_initiator_socket:
|
||||
// This function is called whenever an sc_export (as part of a initiator
|
||||
// socket) wants to bind to the export of the underlying
|
||||
// tlm_initiator_socket, i.e. a hierarchical bind takes place.
|
||||
virtual sc_core::sc_export<tlm::tlm_bw_transport_if<TYPES>> &
|
||||
get_base_export()
|
||||
{
|
||||
if (!m_beoe_disabled) { // We are not bound hierarchically.
|
||||
// So we bind the dummy to avoid a SystemC error.
|
||||
base_type::m_export.bind(m_dummy);
|
||||
// and then return our own export so that the hierarchical
|
||||
// binding is set up properly.
|
||||
return base_type::get_base_export();
|
||||
}
|
||||
}
|
||||
|
||||
//operator notation for hierarchical bind
|
||||
void operator() (base_type& s)
|
||||
{
|
||||
bind(s);
|
||||
}
|
||||
virtual const sc_core::sc_export<tlm::tlm_bw_transport_if<TYPES>> &
|
||||
get_base_export() const
|
||||
{
|
||||
return base_type::get_base_export();
|
||||
}
|
||||
|
||||
//get access to sub port
|
||||
tlm::tlm_fw_transport_if<TYPES>* operator[](int i){return m_used_sockets[i];}
|
||||
// Bind against a target socket.
|
||||
virtual void
|
||||
bind(base_target_socket_type &s)
|
||||
{
|
||||
// Error if this socket is already bound hierarchically.
|
||||
if (m_hierarch_bind) {
|
||||
display_error("Already hierarchically bound.");
|
||||
return;
|
||||
}
|
||||
|
||||
//get the number of bound targets
|
||||
// NOTE: this is only valid at end of elaboration!
|
||||
unsigned int size() {return get_hierarch_bind()->get_sockets().size();}
|
||||
// Satisfy systemC, leads to a call to get_base_interface().
|
||||
base_type::bind(s);
|
||||
|
||||
protected:
|
||||
using base_type::display_warning;
|
||||
using base_type::display_error;
|
||||
// Try to cast the target socket into a fw interface.
|
||||
sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES>> *p_ex_s =
|
||||
dynamic_cast<sc_core::sc_export<
|
||||
tlm::tlm_fw_transport_if<TYPES>> *>(&s);
|
||||
if (!p_ex_s) {
|
||||
display_error("Multi socket not bound to tlm_socket.");
|
||||
return;
|
||||
}
|
||||
|
||||
//implementation of base class interface
|
||||
base_type* get_hierarch_bind(){if (m_hierarch_bind) return m_hierarch_bind->get_hierarch_bind(); else return this;}
|
||||
void disable_cb_bind(){ m_beoe_disabled=true;}
|
||||
std::vector<callback_binder_bw<TYPES>* >& get_binders(){return m_binders;}
|
||||
std::vector<tlm::tlm_fw_transport_if<TYPES>*>& get_sockets(){return m_sockets;}
|
||||
//vector of connected sockets
|
||||
std::vector<tlm::tlm_fw_transport_if<TYPES>*> m_sockets;
|
||||
std::vector<tlm::tlm_fw_transport_if<TYPES>*> m_used_sockets;
|
||||
//vector of binders that convert untagged interface into tagged interface
|
||||
std::vector<callback_binder_bw<TYPES>*> m_binders;
|
||||
// Try a cast into a multi sockets.
|
||||
multi_to_multi_bind_base<TYPES> *test =
|
||||
dynamic_cast<multi_to_multi_bind_base<TYPES> *>(p_ex_s);
|
||||
if (test) {
|
||||
// Did we just do a multi-multi bind??
|
||||
// If that is the case the multi target socket must have just
|
||||
// created a callback binder which we want to get from it.
|
||||
// Moreover, we also just created one, which we will pass to it.
|
||||
m_sockets.push_back(test->get_last_binder(
|
||||
m_binders[m_binders.size() - 1]));
|
||||
} else { // If not just bind normally,
|
||||
sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES>> &ex_s =
|
||||
*p_ex_s;
|
||||
// Store the interface we are bound against.
|
||||
m_sockets.push_back(&((tlm::tlm_fw_transport_if<TYPES> &)ex_s));
|
||||
}
|
||||
}
|
||||
|
||||
base_type* m_hierarch_bind; //pointer to hierarchical bound multi port
|
||||
bool m_beoe_disabled; // bool that remembers whether this socket shall bind callbacks or not
|
||||
callback_binder_bw<TYPES> m_dummy; //a callback binder that is bound to the underlying export
|
||||
// in case there was no real bind
|
||||
// Operator notation for direct bind.
|
||||
void operator() (base_target_socket_type &s) { bind(s); }
|
||||
|
||||
//callbacks as functors
|
||||
// (allows to pass the callback to another socket that does not know the type of the module that owns
|
||||
// the callbacks)
|
||||
typename callback_binder_bw<TYPES>::nb_func_type m_nb_f;
|
||||
typename callback_binder_bw<TYPES>::dmi_func_type m_dmi_f;
|
||||
// SystemC standard callback before end of elaboration.
|
||||
void
|
||||
before_end_of_elaboration()
|
||||
{
|
||||
// If our export hasn't been bound yet (due to a hierarch binding)
|
||||
// we bind it now to avoid a SystemC error. We must do that because it
|
||||
// is legal not to register a callback on this socket as the user
|
||||
// might only use b_transport.
|
||||
if (!base_type::m_export.get_interface()) {
|
||||
base_type::m_export.bind(m_dummy);
|
||||
}
|
||||
|
||||
// 'break' here if the socket was told not to do callback binding.
|
||||
if (m_beoe_disabled)
|
||||
return;
|
||||
|
||||
// Get the callback binders of the top of the hierachical bind chain.
|
||||
// NOTE: this could be the same socket if there is no hierachical bind.
|
||||
std::vector<callback_binder_bw<TYPES> *> &binders =
|
||||
get_hierarch_bind()->get_binders();
|
||||
|
||||
// Get the interfaces bound to the top of the hierachical bind chain.
|
||||
// NOTE: this could be the same socket if there is no hierachical bind.
|
||||
m_used_sockets = get_hierarch_bind()->get_sockets();
|
||||
|
||||
// Register the callbacks of this socket with the callback binders
|
||||
// we just got from the top of the hierachical bind chain.
|
||||
for (unsigned int i = 0; i < binders.size(); i++) {
|
||||
binders[i]->set_callbacks(m_nb_f, m_dmi_f);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Bind multi initiator socket to multi initiator socket (hierarchical
|
||||
// bind).
|
||||
//
|
||||
virtual void
|
||||
bind(base_type& s)
|
||||
{
|
||||
if (m_binders.size()) {
|
||||
// A multi socket is either bound hierarchically or directly.
|
||||
display_error("Socket already directly bound.");
|
||||
return;
|
||||
}
|
||||
if (m_hierarch_bind) {
|
||||
display_warning("Socket already bound hierarchically. "
|
||||
"Bind attempt ignored.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Remember to which socket we are hierarchically bound and disable it,
|
||||
// so that it won't try to register callbacks itself.
|
||||
s.disable_cb_bind();
|
||||
m_hierarch_bind = &s;
|
||||
base_type::bind(s); // Satisfy SystemC.
|
||||
}
|
||||
|
||||
// Operator notation for hierarchical bind.
|
||||
void operator() (base_type &s) { bind(s); }
|
||||
|
||||
// Get access to sub port.
|
||||
tlm::tlm_fw_transport_if<TYPES> *
|
||||
operator [] (int i)
|
||||
{
|
||||
return m_used_sockets[i];
|
||||
}
|
||||
|
||||
// Get the number of bound targets.
|
||||
// NOTE: This is only valid at end of elaboration!
|
||||
unsigned int size() { return get_hierarch_bind()->get_sockets().size(); }
|
||||
|
||||
protected:
|
||||
using base_type::display_warning;
|
||||
using base_type::display_error;
|
||||
|
||||
// Implementation of base class interface.
|
||||
base_type *
|
||||
get_hierarch_bind()
|
||||
{
|
||||
if (m_hierarch_bind)
|
||||
return m_hierarch_bind->get_hierarch_bind();
|
||||
else
|
||||
return this;
|
||||
}
|
||||
void disable_cb_bind() { m_beoe_disabled = true; }
|
||||
std::vector<callback_binder_bw<TYPES> *> &
|
||||
get_binders()
|
||||
{
|
||||
return m_binders;
|
||||
}
|
||||
std::vector<tlm::tlm_fw_transport_if<TYPES> *> &
|
||||
get_sockets()
|
||||
{
|
||||
return m_sockets;
|
||||
}
|
||||
// Vector of connected sockets.
|
||||
std::vector<tlm::tlm_fw_transport_if<TYPES> *> m_sockets;
|
||||
std::vector<tlm::tlm_fw_transport_if<TYPES> *> m_used_sockets;
|
||||
// Vector of binders that convert untagged interface into tagged interface.
|
||||
std::vector<callback_binder_bw<TYPES> *> m_binders;
|
||||
|
||||
base_type *m_hierarch_bind; // Pointer to hierarchical bound multi port.
|
||||
// bool that remembers whether this socket shall bind callbacks or not.
|
||||
bool m_beoe_disabled;
|
||||
// A callback binder that is bound to the underlying export
|
||||
// in case there was no real bind.
|
||||
callback_binder_bw<TYPES> m_dummy;
|
||||
|
||||
//callbacks as functors
|
||||
// (allows to pass the callback to another socket that does not know the
|
||||
// type of the module that owns the callbacks).
|
||||
typename callback_binder_bw<TYPES>::nb_func_type m_nb_f;
|
||||
typename callback_binder_bw<TYPES>::dmi_func_type m_dmi_f;
|
||||
};
|
||||
|
||||
template <typename MODULE,
|
||||
unsigned int BUSWIDTH = 32,
|
||||
typename TYPES = tlm::tlm_base_protocol_types,
|
||||
unsigned int N=0>
|
||||
class multi_passthrough_initiator_socket_optional
|
||||
: public multi_passthrough_initiator_socket<MODULE,BUSWIDTH,TYPES,N,sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types, unsigned int N=0>
|
||||
class multi_passthrough_initiator_socket_optional :
|
||||
public multi_passthrough_initiator_socket<
|
||||
MODULE, BUSWIDTH, TYPES, N, sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
{
|
||||
typedef multi_passthrough_initiator_socket<MODULE,BUSWIDTH,TYPES,N,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
multi_passthrough_initiator_socket_optional() : socket_b() {}
|
||||
explicit multi_passthrough_initiator_socket_optional(const char* name) : socket_b(name) {}
|
||||
typedef multi_passthrough_initiator_socket<
|
||||
MODULE, BUSWIDTH, TYPES, N, sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
multi_passthrough_initiator_socket_optional() : socket_b() {}
|
||||
explicit multi_passthrough_initiator_socket_optional(const char *name) :
|
||||
socket_b(name)
|
||||
{}
|
||||
};
|
||||
|
||||
} // namespace tlm_utils
|
||||
#endif // TLM_UTILS_MULTI_PASSTHROUGH_INITIATOR_SOCKET_H_INCLUDED_
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_MULTI_PASSTHROUGH_INITIATOR_SOCKET_H__ */
|
||||
|
||||
@@ -16,12 +16,13 @@
|
||||
permissions and limitations under the License.
|
||||
|
||||
*****************************************************************************/
|
||||
#ifndef TLM_UTILS_MULTI_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
|
||||
#define TLM_UTILS_MULTI_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_MULTI_PASSTHROUGH_TARGET_SOCKET_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_MULTI_PASSTHROUGH_TARGET_SOCKET_H__
|
||||
|
||||
#include "tlm_utils/multi_socket_bases.h"
|
||||
|
||||
namespace tlm_utils {
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
/*
|
||||
This class implements a trivial multi target socket.
|
||||
@@ -34,295 +35,347 @@ he likes to use. The callbacks are basically equal to the fw interface
|
||||
methods but carry an additional integer that indicates to which
|
||||
index of this socket the calling initiator is connected.
|
||||
*/
|
||||
template <typename MODULE,
|
||||
unsigned int BUSWIDTH = 32,
|
||||
typename TYPES = tlm::tlm_base_protocol_types,
|
||||
unsigned int N=0,
|
||||
sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class multi_passthrough_target_socket
|
||||
: public multi_target_base< BUSWIDTH, TYPES, N, POL>
|
||||
, public multi_to_multi_bind_base<TYPES>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types, unsigned int N=0,
|
||||
sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class multi_passthrough_target_socket :
|
||||
public multi_target_base< BUSWIDTH, TYPES, N, POL>,
|
||||
public multi_to_multi_bind_base<TYPES>
|
||||
{
|
||||
public:
|
||||
//typedefs
|
||||
// tlm 2.0 types for nb_transport
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
|
||||
public:
|
||||
// typedefs to keep the fn ptr notations short
|
||||
typedef sync_enum_type (MODULE::*nb_cb)(
|
||||
int, transaction_type &, phase_type &, sc_core::sc_time &);
|
||||
typedef void (MODULE::*b_cb)(int, transaction_type &, sc_core::sc_time &);
|
||||
typedef unsigned int (MODULE::*dbg_cb)(int, transaction_type &txn);
|
||||
typedef bool (MODULE::*dmi_cb)(
|
||||
int, transaction_type &txn, tlm::tlm_dmi &dmi);
|
||||
|
||||
//typedefs
|
||||
// tlm 2.0 types for nb_transport
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
typedef multi_target_base<BUSWIDTH, TYPES, N, POL> base_type;
|
||||
|
||||
// typedefs to keep the fn ptr notations short
|
||||
typedef sync_enum_type (MODULE::*nb_cb)(int, transaction_type&, phase_type&, sc_core::sc_time&);
|
||||
typedef void (MODULE::*b_cb)(int, transaction_type&, sc_core::sc_time&);
|
||||
typedef unsigned int (MODULE::*dbg_cb)(int, transaction_type& txn);
|
||||
typedef bool (MODULE::*dmi_cb)(int, transaction_type& txn, tlm::tlm_dmi& dmi);
|
||||
typedef typename base_type::base_initiator_socket_type
|
||||
base_initiator_socket_type;
|
||||
|
||||
typedef multi_target_base<BUSWIDTH, TYPES, N, POL> base_type;
|
||||
|
||||
typedef typename base_type::base_initiator_socket_type base_initiator_socket_type;
|
||||
|
||||
static const char* default_name()
|
||||
{ return sc_core::sc_gen_unique_name("multi_passthrough_target_socket"); }
|
||||
|
||||
//CTOR
|
||||
explicit multi_passthrough_target_socket(const char* name = default_name())
|
||||
: base_type(name)
|
||||
, m_hierarch_bind(0)
|
||||
, m_eoe_disabled(false)
|
||||
, m_export_callback_created(false)
|
||||
{
|
||||
}
|
||||
|
||||
~multi_passthrough_target_socket(){
|
||||
//clean up everything allocated by 'new'
|
||||
for (unsigned int i=0; i<m_binders.size(); i++) delete m_binders[i];
|
||||
}
|
||||
|
||||
void check_export_binding()
|
||||
{
|
||||
//if our export hasn't been bound yet (due to a hierarch binding)
|
||||
// we bind it now.
|
||||
//We do that here as the user of the target port HAS to bind at least on callback,
|
||||
//otherwise the socket was useless. Nevertheless, the target socket may still
|
||||
// stay unbound afterwards.
|
||||
if (!sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >::get_interface())
|
||||
static const char *
|
||||
default_name()
|
||||
{
|
||||
// We bind to a callback_binder that will be used as the first interface
|
||||
// i.e. calls to the sc_export will have the same ID as calls from the first initator
|
||||
// socket bound
|
||||
callback_binder_fw<TYPES> * binder;
|
||||
|
||||
if (m_binders.size() == 0)
|
||||
{
|
||||
binder = new callback_binder_fw<TYPES>(this, m_binders.size());
|
||||
m_binders.push_back(binder);
|
||||
m_export_callback_created = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
binder = m_binders[0];
|
||||
}
|
||||
|
||||
sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >::bind(*binder);
|
||||
}
|
||||
}
|
||||
|
||||
//register callback for nb transport of fw interface
|
||||
void register_nb_transport_fw(MODULE* mod,
|
||||
nb_cb cb)
|
||||
{
|
||||
check_export_binding();
|
||||
|
||||
//warn if there already is a callback
|
||||
if (m_nb_f.is_valid()){
|
||||
display_warning("NBTransport_bw callback already registered.");
|
||||
return;
|
||||
return sc_core::sc_gen_unique_name("multi_passthrough_target_socket");
|
||||
}
|
||||
|
||||
//set the functor
|
||||
m_nb_f.set_function(mod, cb);
|
||||
}
|
||||
explicit multi_passthrough_target_socket(const char *name=default_name()) :
|
||||
base_type(name), m_hierarch_bind(0), m_eoe_disabled(false),
|
||||
m_export_callback_created(false)
|
||||
{}
|
||||
|
||||
//register callback for b transport of fw interface
|
||||
void register_b_transport(MODULE* mod,
|
||||
b_cb cb)
|
||||
{
|
||||
check_export_binding();
|
||||
|
||||
//warn if there already is a callback
|
||||
if (m_b_f.is_valid()){
|
||||
display_warning("BTransport callback already registered.");
|
||||
return;
|
||||
~multi_passthrough_target_socket()
|
||||
{
|
||||
// Clean up everything allocated by 'new'.
|
||||
for (unsigned int i = 0; i < m_binders.size(); i++)
|
||||
delete m_binders[i];
|
||||
}
|
||||
|
||||
//set the functor
|
||||
m_b_f.set_function(mod, cb);
|
||||
}
|
||||
void
|
||||
check_export_binding()
|
||||
{
|
||||
// If our export hasn't been bound yet (due to a hierarch binding)
|
||||
// we bind it now. We do that here as the user of the target port HAS
|
||||
// to bind at least on callback, otherwise the socket was useless.
|
||||
// Nevertheless, the target socket may still stay unbound afterwards.
|
||||
if (!sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES>>::
|
||||
get_interface()) {
|
||||
// We bind to a callback_binder that will be used as the first
|
||||
// interface i.e. calls to the sc_export will have the same ID as
|
||||
// calls from the first initator socket bound.
|
||||
callback_binder_fw<TYPES> *binder;
|
||||
|
||||
//register callback for debug transport of fw interface
|
||||
void register_transport_dbg(MODULE* mod,
|
||||
dbg_cb cb)
|
||||
{
|
||||
check_export_binding();
|
||||
if (m_binders.size() == 0) {
|
||||
binder = new callback_binder_fw<TYPES>(
|
||||
this, m_binders.size());
|
||||
m_binders.push_back(binder);
|
||||
m_export_callback_created = true;
|
||||
} else {
|
||||
binder = m_binders[0];
|
||||
}
|
||||
|
||||
//warn if there already is a callback
|
||||
if (m_dbg_f.is_valid()){
|
||||
display_warning("DebugTransport callback already registered.");
|
||||
return;
|
||||
sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES>>::bind(*binder);
|
||||
}
|
||||
}
|
||||
|
||||
//set the functor
|
||||
m_dbg_f.set_function(mod, cb);
|
||||
}
|
||||
//register callback for nb transport of fw interface
|
||||
void
|
||||
register_nb_transport_fw(MODULE *mod, nb_cb cb)
|
||||
{
|
||||
check_export_binding();
|
||||
|
||||
//register callback for DMI of fw interface
|
||||
void register_get_direct_mem_ptr(MODULE* mod,
|
||||
dmi_cb cb)
|
||||
{
|
||||
check_export_binding();
|
||||
// Warn if there already is a callback.
|
||||
if (m_nb_f.is_valid()) {
|
||||
display_warning("NBTransport_bw callback already registered.");
|
||||
return;
|
||||
}
|
||||
|
||||
//warn if there already is a callback
|
||||
if (m_dmi_f.is_valid()){
|
||||
display_warning("DMI callback already registered.");
|
||||
return;
|
||||
// Set the functor.
|
||||
m_nb_f.set_function(mod, cb);
|
||||
}
|
||||
|
||||
//set the functor
|
||||
m_dmi_f.set_function(mod, cb);
|
||||
}
|
||||
// Register callback for b transport of fw interface.
|
||||
void
|
||||
register_b_transport(MODULE *mod, b_cb cb)
|
||||
{
|
||||
check_export_binding();
|
||||
|
||||
// Warn if there already is a callback.
|
||||
if (m_b_f.is_valid()) {
|
||||
display_warning("BTransport callback already registered.");
|
||||
return;
|
||||
}
|
||||
|
||||
//Override virtual functions of the tlm_target_socket:
|
||||
// this function is called whenever an sc_port (as part of a init socket)
|
||||
// wants to bind to the export of the underlying tlm_target_socket
|
||||
//At this time a callback binder is created an returned to the sc_port
|
||||
// of the init socket, so that it binds to the callback binder
|
||||
virtual tlm::tlm_fw_transport_if<TYPES>& get_base_interface()
|
||||
{
|
||||
//error if this socket is already bound hierarchically
|
||||
if (m_hierarch_bind) display_error("Socket already bound hierarchically.");
|
||||
|
||||
if (m_export_callback_created) {
|
||||
// consume binder created from the callback registration
|
||||
m_export_callback_created = false;
|
||||
} else {
|
||||
m_binders.push_back(new callback_binder_fw<TYPES>(this, m_binders.size()));
|
||||
// Set the functor.
|
||||
m_b_f.set_function(mod, cb);
|
||||
}
|
||||
|
||||
return *m_binders[m_binders.size()-1];
|
||||
}
|
||||
// Register callback for debug transport of fw interface.
|
||||
void
|
||||
register_transport_dbg(MODULE *mod, dbg_cb cb)
|
||||
{
|
||||
check_export_binding();
|
||||
|
||||
// const overload not allowed for multi-sockets
|
||||
virtual const tlm::tlm_fw_transport_if<TYPES>& get_base_interface() const
|
||||
{
|
||||
display_error("'get_base_interface() const' not allowed for multi-sockets.");
|
||||
return base_type::get_base_interface();
|
||||
}
|
||||
// Warn if there already is a callback.
|
||||
if (m_dbg_f.is_valid()) {
|
||||
display_warning("DebugTransport callback already registered.");
|
||||
return;
|
||||
}
|
||||
|
||||
//just return the export of the underlying tlm_target_socket in case of a hierarchical bind
|
||||
virtual sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >& get_base_export()
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
//just return the export of the underlying tlm_target_socket in case of a hierarchical bind
|
||||
virtual const sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >& get_base_export() const
|
||||
{
|
||||
return base_type::get_base_export();
|
||||
}
|
||||
|
||||
//the standard end of elaboration callback
|
||||
void end_of_elaboration(){
|
||||
//'break' here if the socket was told not to do callback binding
|
||||
if (m_eoe_disabled) return;
|
||||
|
||||
//get the callback binders and the multi binds of the top of the hierachical bind chain
|
||||
// NOTE: this could be the same socket if there is no hierachical bind
|
||||
std::vector<callback_binder_fw<TYPES>* >& binders=get_hierarch_bind()->get_binders();
|
||||
std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*>& multi_binds=get_hierarch_bind()->get_multi_binds();
|
||||
|
||||
// complete binding only if there has been a real bind
|
||||
bool unbound = (binders.size() == 1 && m_export_callback_created);
|
||||
// no call to get_base_interface has consumed the export - ignore
|
||||
if (unbound) return;
|
||||
|
||||
// iterate over all binders
|
||||
for (unsigned int i=0; i<binders.size(); i++) {
|
||||
binders[i]->set_callbacks(m_nb_f, m_b_f, m_dmi_f, m_dbg_f); //set the callbacks for the binder
|
||||
if (multi_binds.find(i)!=multi_binds.end()) //check if this connection is multi-multi
|
||||
//if so remember the interface
|
||||
m_sockets.push_back(multi_binds[i]);
|
||||
else{ //if we are bound to a normal socket
|
||||
//get the calling port and try to cast it into a tlm socket base
|
||||
base_initiator_socket_type* test=dynamic_cast<base_initiator_socket_type*>(binders[i]->get_other_side());
|
||||
if (!test){display_error("Not bound to tlm_socket.");}
|
||||
m_sockets.push_back(&test->get_base_interface()); //remember the interface
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Bind multi target socket to multi target socket (hierarchical bind)
|
||||
//
|
||||
virtual void bind(base_type& s)
|
||||
{
|
||||
//warn if already bound hierarchically
|
||||
if (m_eoe_disabled){
|
||||
display_warning("Socket already bound hierarchically. Bind attempt ignored.");
|
||||
return;
|
||||
// Set the functor.
|
||||
m_dbg_f.set_function(mod, cb);
|
||||
}
|
||||
|
||||
//disable our own end of elaboration call
|
||||
disable_cb_bind();
|
||||
// Register callback for DMI of fw interface.
|
||||
void
|
||||
register_get_direct_mem_ptr(MODULE *mod, dmi_cb cb)
|
||||
{
|
||||
check_export_binding();
|
||||
|
||||
//inform the bound target socket that it is bound hierarchically now
|
||||
s.set_hierarch_bind((base_type*)this);
|
||||
base_type::bind(s); //satisfy SystemC
|
||||
}
|
||||
// Warn if there already is a callback.
|
||||
if (m_dmi_f.is_valid()) {
|
||||
display_warning("DMI callback already registered.");
|
||||
return;
|
||||
}
|
||||
|
||||
//operator notation for hierarchical bind
|
||||
void operator() (base_type& s)
|
||||
{
|
||||
bind(s);
|
||||
}
|
||||
// Set the functor.
|
||||
m_dmi_f.set_function(mod, cb);
|
||||
}
|
||||
|
||||
//get access to sub port
|
||||
tlm::tlm_bw_transport_if<TYPES>* operator[](int i){return m_sockets[i];}
|
||||
|
||||
//get number of bound initiators
|
||||
// NOTE: this is only valid at end of elaboration!
|
||||
unsigned int size(){return get_hierarch_bind()->get_binders().size();}
|
||||
// Override virtual functions of the tlm_target_socket:
|
||||
// this function is called whenever an sc_port (as part of a init socket)
|
||||
// wants to bind to the export of the underlying tlm_target_socket
|
||||
// At this time a callback binder is created an returned to the sc_port
|
||||
// of the init socket, so that it binds to the callback binder.
|
||||
virtual tlm::tlm_fw_transport_if<TYPES> &
|
||||
get_base_interface()
|
||||
{
|
||||
// Error if this socket is already bound hierarchically.
|
||||
if (m_hierarch_bind)
|
||||
display_error("Socket already bound hierarchically.");
|
||||
|
||||
protected:
|
||||
using base_type::display_warning;
|
||||
using base_type::display_error;
|
||||
if (m_export_callback_created) {
|
||||
// Consume binder created from the callback registration.
|
||||
m_export_callback_created = false;
|
||||
} else {
|
||||
m_binders.push_back(
|
||||
new callback_binder_fw<TYPES>(this, m_binders.size()));
|
||||
}
|
||||
|
||||
//implementation of base class interface
|
||||
base_type* get_hierarch_bind(){if (m_hierarch_bind) return m_hierarch_bind->get_hierarch_bind(); else return this;}
|
||||
std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*>& get_multi_binds(){return m_multi_binds;}
|
||||
void set_hierarch_bind(base_type* h){m_hierarch_bind=h;}
|
||||
tlm::tlm_fw_transport_if<TYPES>* get_last_binder(tlm::tlm_bw_transport_if<TYPES>* other){
|
||||
m_multi_binds[m_binders.size()-1]=other;
|
||||
return m_binders[m_binders.size()-1];
|
||||
}
|
||||
return *m_binders[m_binders.size()-1];
|
||||
}
|
||||
|
||||
//map that stores to which index a multi init socket is connected
|
||||
// and the interface of the multi init socket
|
||||
std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*> m_multi_binds;
|
||||
// Const overload not allowed for multi-sockets.
|
||||
virtual const tlm::tlm_fw_transport_if<TYPES> &
|
||||
get_base_interface() const
|
||||
{
|
||||
display_error("'get_base_interface() const'"
|
||||
" not allowed for multi-sockets.");
|
||||
return base_type::get_base_interface();
|
||||
}
|
||||
|
||||
void disable_cb_bind(){ m_eoe_disabled=true;}
|
||||
std::vector<callback_binder_fw<TYPES>* >& get_binders(){return m_binders;}
|
||||
//vector of connected sockets
|
||||
std::vector<tlm::tlm_bw_transport_if<TYPES>*> m_sockets;
|
||||
//vector of binders that convert untagged interface into tagged interface
|
||||
std::vector<callback_binder_fw<TYPES>*> m_binders;
|
||||
// Just return the export of the underlying tlm_target_socket in case of
|
||||
// a hierarchical bind.
|
||||
virtual sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES>> &
|
||||
get_base_export()
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
|
||||
base_type* m_hierarch_bind; //pointer to hierarchical bound multi port
|
||||
bool m_eoe_disabled; //bool that disables callback bindings at end of elaboration
|
||||
bool m_export_callback_created; //bool that indicates that a binder has been created from a callback registration
|
||||
// Just return the export of the underlying tlm_target_socket in case of
|
||||
// a hierarchical bind.
|
||||
virtual const sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES>> &
|
||||
get_base_export() const
|
||||
{
|
||||
return base_type::get_base_export();
|
||||
}
|
||||
|
||||
//callbacks as functors
|
||||
// (allows to pass the callback to another socket that does not know the type of the module that owns
|
||||
// the callbacks)
|
||||
typename callback_binder_fw<TYPES>::nb_func_type m_nb_f;
|
||||
typename callback_binder_fw<TYPES>::b_func_type m_b_f;
|
||||
typename callback_binder_fw<TYPES>::debug_func_type m_dbg_f;
|
||||
typename callback_binder_fw<TYPES>::dmi_func_type m_dmi_f;
|
||||
// The standard end of elaboration callback.
|
||||
void
|
||||
end_of_elaboration()
|
||||
{
|
||||
// 'break' here if the socket was told not to do callback binding.
|
||||
if (m_eoe_disabled)
|
||||
return;
|
||||
|
||||
// Get the callback binders and the multi binds of the top of the
|
||||
// hierachical bind chain.
|
||||
// NOTE: this could be the same socket if there is no hierachical
|
||||
// bind.
|
||||
std::vector<callback_binder_fw<TYPES> *> &binders =
|
||||
get_hierarch_bind()->get_binders();
|
||||
std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES> *> &
|
||||
multi_binds = get_hierarch_bind()->get_multi_binds();
|
||||
|
||||
// Complete binding only if there has been a real bind.
|
||||
bool unbound = (binders.size() == 1 && m_export_callback_created);
|
||||
// No call to get_base_interface has consumed the export - ignore.
|
||||
if (unbound)
|
||||
return;
|
||||
|
||||
// Iterate over all binders.
|
||||
for (unsigned int i = 0; i < binders.size(); i++) {
|
||||
// Set the callbacks for the binder.
|
||||
binders[i]->set_callbacks(m_nb_f, m_b_f, m_dmi_f, m_dbg_f);
|
||||
// Check if this connection is multi-multi.
|
||||
if (multi_binds.find(i) != multi_binds.end()) {
|
||||
// If so remember the interface.
|
||||
m_sockets.push_back(multi_binds[i]);
|
||||
} else {
|
||||
// If we are bound to a normal socket.
|
||||
// Get the calling port and try to cast it into a tlm socket
|
||||
// base.
|
||||
base_initiator_socket_type *test =
|
||||
dynamic_cast<base_initiator_socket_type*>(
|
||||
binders[i]->get_other_side());
|
||||
if (!test) {
|
||||
display_error("Not bound to tlm_socket.");
|
||||
}
|
||||
// Remember the interface.
|
||||
m_sockets.push_back(&test->get_base_interface());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Bind multi target socket to multi target socket (hierarchical bind)
|
||||
//
|
||||
virtual void
|
||||
bind(base_type &s)
|
||||
{
|
||||
// Warn if already bound hierarchically.
|
||||
if (m_eoe_disabled) {
|
||||
display_warning("Socket already bound hierarchically. "
|
||||
"Bind attempt ignored.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Disable our own end of elaboration call.
|
||||
disable_cb_bind();
|
||||
|
||||
// Inform the bound target socket that it is bound
|
||||
// hierarchically now.
|
||||
s.set_hierarch_bind((base_type*)this);
|
||||
base_type::bind(s); // Satisfy SystemC.
|
||||
}
|
||||
|
||||
// Operator notation for hierarchical bind.
|
||||
void operator () (base_type &s) { bind(s); }
|
||||
|
||||
// Get access to sub port.
|
||||
tlm::tlm_bw_transport_if<TYPES> *
|
||||
operator [] (int i)
|
||||
{
|
||||
return m_sockets[i];
|
||||
}
|
||||
|
||||
// Get number of bound initiators.
|
||||
// NOTE: this is only valid at end of elaboration!
|
||||
unsigned int size() { return get_hierarch_bind()->get_binders().size(); }
|
||||
|
||||
protected:
|
||||
using base_type::display_warning;
|
||||
using base_type::display_error;
|
||||
|
||||
// Implementation of base class interface.
|
||||
base_type *
|
||||
get_hierarch_bind()
|
||||
{
|
||||
if (m_hierarch_bind)
|
||||
return m_hierarch_bind->get_hierarch_bind();
|
||||
else
|
||||
return this;
|
||||
}
|
||||
std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES> *> &
|
||||
get_multi_binds()
|
||||
{
|
||||
return m_multi_binds;
|
||||
}
|
||||
void set_hierarch_bind(base_type* h) { m_hierarch_bind = h; }
|
||||
tlm::tlm_fw_transport_if<TYPES> *
|
||||
get_last_binder(tlm::tlm_bw_transport_if<TYPES> *other)
|
||||
{
|
||||
m_multi_binds[m_binders.size() - 1] = other;
|
||||
return m_binders[m_binders.size() - 1];
|
||||
}
|
||||
|
||||
// Map that stores to which index a multi init socket is connected
|
||||
// and the interface of the multi init socket.
|
||||
std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES> *> m_multi_binds;
|
||||
|
||||
void disable_cb_bind() { m_eoe_disabled = true; }
|
||||
std::vector<callback_binder_fw<TYPES> *> &
|
||||
get_binders()
|
||||
{
|
||||
return m_binders;
|
||||
}
|
||||
// Vector of connected sockets.
|
||||
std::vector<tlm::tlm_bw_transport_if<TYPES> *> m_sockets;
|
||||
// Vector of binders that convert untagged interface into tagged
|
||||
// interface.
|
||||
std::vector<callback_binder_fw<TYPES> *> m_binders;
|
||||
|
||||
base_type *m_hierarch_bind; // Pointer to hierarchical bound multi port.
|
||||
// bool that disables callback bindings at end of elaboration.
|
||||
bool m_eoe_disabled;
|
||||
// bool that indicates that a binder has been created from a callback
|
||||
// registration.
|
||||
bool m_export_callback_created;
|
||||
|
||||
// callbacks as functors
|
||||
// (allows to pass the callback to another socket that does not know
|
||||
// the type of the module that owns the callbacks).
|
||||
typename callback_binder_fw<TYPES>::nb_func_type m_nb_f;
|
||||
typename callback_binder_fw<TYPES>::b_func_type m_b_f;
|
||||
typename callback_binder_fw<TYPES>::debug_func_type m_dbg_f;
|
||||
typename callback_binder_fw<TYPES>::dmi_func_type m_dmi_f;
|
||||
};
|
||||
|
||||
template <typename MODULE,
|
||||
unsigned int BUSWIDTH = 32,
|
||||
typename TYPES = tlm::tlm_base_protocol_types,
|
||||
unsigned int N=0>
|
||||
class multi_passthrough_target_socket_optional
|
||||
: public multi_passthrough_target_socket<MODULE,BUSWIDTH,TYPES,N,sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types, unsigned int N=0>
|
||||
class multi_passthrough_target_socket_optional :
|
||||
public multi_passthrough_target_socket<
|
||||
MODULE, BUSWIDTH, TYPES, N, sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
{
|
||||
typedef multi_passthrough_target_socket<MODULE,BUSWIDTH,TYPES,N,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
multi_passthrough_target_socket_optional() : socket_b() {}
|
||||
explicit multi_passthrough_target_socket_optional(const char* name) : socket_b(name) {}
|
||||
typedef multi_passthrough_target_socket<
|
||||
MODULE, BUSWIDTH, TYPES, N, sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
multi_passthrough_target_socket_optional() : socket_b() {}
|
||||
explicit multi_passthrough_target_socket_optional(const char *name) :
|
||||
socket_b(name)
|
||||
{}
|
||||
};
|
||||
|
||||
} // namespace tlm_utils
|
||||
#endif // TLM_UTILS_MULTI_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_MULTI_PASSTHROUGH_TARGET_SOCKET_H__ */
|
||||
|
||||
@@ -17,99 +17,116 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_UTILS_MULTI_SOCKET_BASES_H_INCLUDED_
|
||||
#define TLM_UTILS_MULTI_SOCKET_BASES_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_MULTI_SOCKET_BASES_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_MULTI_SOCKET_BASES_H__
|
||||
|
||||
#include <map>
|
||||
#include <tlm>
|
||||
#include "tlm_utils/convenience_socket_bases.h"
|
||||
|
||||
#include <map>
|
||||
|
||||
namespace tlm_utils {
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
template <typename signature>
|
||||
struct fn_container{
|
||||
signature function;
|
||||
struct fn_container
|
||||
{
|
||||
signature function;
|
||||
};
|
||||
|
||||
#define TLM_DEFINE_FUNCTOR(name) \
|
||||
template <typename MODULE, typename TRAITS> \
|
||||
inline TLM_RET_VAL static_##name( void* mod \
|
||||
, void* fn \
|
||||
, int index \
|
||||
, TLM_FULL_ARG_LIST) \
|
||||
inline TLM_RET_VAL \
|
||||
static_##name(void *mod, void *fn, int index, TLM_FULL_ARG_LIST) \
|
||||
{ \
|
||||
typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> fn_container_type; \
|
||||
MODULE* tmp_mod=static_cast<MODULE*>(mod); \
|
||||
fn_container_type* tmp_cb =static_cast<fn_container_type*> (fn); \
|
||||
return (tmp_mod->*(tmp_cb->function))(index, TLM_ARG_LIST_WITHOUT_TYPES); \
|
||||
}\
|
||||
\
|
||||
template <typename MODULE, typename TRAITS> \
|
||||
inline void delete_fn_container_of_##name(void* fn) \
|
||||
{ \
|
||||
typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> fn_container_type; \
|
||||
fn_container_type* tmp_cb =static_cast<fn_container_type*> (fn); \
|
||||
if (tmp_cb) delete tmp_cb;\
|
||||
typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> \
|
||||
fn_container_type; \
|
||||
MODULE *tmp_mod = static_cast<MODULE *>(mod); \
|
||||
fn_container_type *tmp_cb = static_cast<fn_container_type *> (fn); \
|
||||
return (tmp_mod->*(tmp_cb->function))( \
|
||||
index, TLM_ARG_LIST_WITHOUT_TYPES); \
|
||||
} \
|
||||
\
|
||||
\
|
||||
template <typename MODULE, typename TRAITS> \
|
||||
inline void \
|
||||
delete_fn_container_of_##name(void *fn) \
|
||||
{ \
|
||||
typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> \
|
||||
fn_container_type; \
|
||||
fn_container_type *tmp_cb = static_cast<fn_container_type *>(fn); \
|
||||
if (tmp_cb) \
|
||||
delete tmp_cb; \
|
||||
} \
|
||||
\
|
||||
template <typename TRAITS> \
|
||||
class name##_functor{ \
|
||||
public: \
|
||||
typedef typename TRAITS::tlm_payload_type payload_type; \
|
||||
typedef typename TRAITS::tlm_phase_type phase_type; \
|
||||
typedef TLM_RET_VAL (*call_fn)(void*,void*, int, TLM_FULL_ARG_LIST); \
|
||||
typedef void (*del_fn)(void*); \
|
||||
\
|
||||
name##_functor(): m_fn(0), m_del_fn(0), m_mod(0), m_mem_fn(0){} \
|
||||
~name##_functor(){if (m_del_fn) (*m_del_fn)(m_mem_fn);} \
|
||||
\
|
||||
template <typename MODULE> \
|
||||
void set_function(MODULE* mod, TLM_RET_VAL (MODULE::*cb)(int, TLM_FULL_ARG_LIST)){ \
|
||||
typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> fn_container_type; \
|
||||
m_fn=&static_##name<MODULE,TRAITS>;\
|
||||
m_del_fn=&delete_fn_container_of_##name<MODULE,TRAITS>;\
|
||||
m_del_fn(m_mem_fn); \
|
||||
fn_container_type* tmp= new fn_container_type(); \
|
||||
tmp->function=cb; \
|
||||
m_mod=static_cast<void*>(mod); \
|
||||
m_mem_fn=static_cast<void*>(tmp); \
|
||||
} \
|
||||
typedef typename TRAITS::tlm_payload_type payload_type; \
|
||||
typedef typename TRAITS::tlm_phase_type phase_type; \
|
||||
typedef TLM_RET_VAL (*call_fn)(void *,void *, int, TLM_FULL_ARG_LIST); \
|
||||
typedef void (*del_fn)(void *); \
|
||||
\
|
||||
name##_functor() : m_fn(0), m_del_fn(0), m_mod(0), m_mem_fn(0) {} \
|
||||
~name##_functor() \
|
||||
{ \
|
||||
if (m_del_fn) \
|
||||
(*m_del_fn)(m_mem_fn); \
|
||||
} \
|
||||
\
|
||||
template <typename MODULE> \
|
||||
void \
|
||||
set_function(MODULE *mod, TLM_RET_VAL (MODULE::*cb)( \
|
||||
int, TLM_FULL_ARG_LIST)) \
|
||||
{ \
|
||||
typedef fn_container<TLM_RET_VAL (MODULE::*)( \
|
||||
int, TLM_FULL_ARG_LIST)> fn_container_type; \
|
||||
m_fn = &static_##name<MODULE,TRAITS>; \
|
||||
m_del_fn = &delete_fn_container_of_##name<MODULE, TRAITS>; \
|
||||
m_del_fn(m_mem_fn); \
|
||||
fn_container_type *tmp =new fn_container_type(); \
|
||||
tmp->function = cb; \
|
||||
m_mod = static_cast<void *>(mod); \
|
||||
m_mem_fn = static_cast<void *>(tmp); \
|
||||
} \
|
||||
\
|
||||
TLM_RET_VAL operator()(int index, TLM_FULL_ARG_LIST){ \
|
||||
return m_fn(m_mod,m_mem_fn, index, TLM_ARG_LIST_WITHOUT_TYPES); \
|
||||
} \
|
||||
\
|
||||
bool is_valid(){return (m_mod!=0 && m_mem_fn!=0 && m_fn!=0);}\
|
||||
\
|
||||
protected: \
|
||||
call_fn m_fn;\
|
||||
del_fn m_del_fn; \
|
||||
void* m_mod; \
|
||||
void* m_mem_fn; \
|
||||
private: \
|
||||
name##_functor& operator=(const name##_functor&); \
|
||||
TLM_RET_VAL \
|
||||
operator ()(int index, TLM_FULL_ARG_LIST) \
|
||||
{ \
|
||||
return m_fn(m_mod, m_mem_fn, index, TLM_ARG_LIST_WITHOUT_TYPES); \
|
||||
} \
|
||||
\
|
||||
bool is_valid() { return (m_mod != 0 && m_mem_fn != 0 && m_fn != 0); } \
|
||||
\
|
||||
protected: \
|
||||
call_fn m_fn;\
|
||||
del_fn m_del_fn; \
|
||||
void *m_mod; \
|
||||
void *m_mem_fn; \
|
||||
private: \
|
||||
name##_functor &operator = (const name##_functor &); \
|
||||
}
|
||||
|
||||
|
||||
#define TLM_RET_VAL tlm::tlm_sync_enum
|
||||
#define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn, typename TRAITS::tlm_phase_type& ph, sc_core::sc_time& t
|
||||
#define TLM_ARG_LIST_WITHOUT_TYPES txn,ph,t
|
||||
#define TLM_FULL_ARG_LIST \
|
||||
typename TRAITS::tlm_payload_type &txn, \
|
||||
typename TRAITS::tlm_phase_type &ph, sc_core::sc_time &t
|
||||
#define TLM_ARG_LIST_WITHOUT_TYPES txn, ph, t
|
||||
TLM_DEFINE_FUNCTOR(nb_transport);
|
||||
#undef TLM_RET_VAL
|
||||
#undef TLM_FULL_ARG_LIST
|
||||
#undef TLM_ARG_LIST_WITHOUT_TYPES
|
||||
|
||||
#define TLM_RET_VAL void
|
||||
#define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn, sc_core::sc_time& t
|
||||
#define TLM_ARG_LIST_WITHOUT_TYPES txn,t
|
||||
#define TLM_FULL_ARG_LIST \
|
||||
typename TRAITS::tlm_payload_type &txn, sc_core::sc_time &t
|
||||
#define TLM_ARG_LIST_WITHOUT_TYPES txn, t
|
||||
TLM_DEFINE_FUNCTOR(b_transport);
|
||||
#undef TLM_RET_VAL
|
||||
#undef TLM_FULL_ARG_LIST
|
||||
#undef TLM_ARG_LIST_WITHOUT_TYPES
|
||||
|
||||
#define TLM_RET_VAL unsigned int
|
||||
#define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn
|
||||
#define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type &txn
|
||||
#define TLM_ARG_LIST_WITHOUT_TYPES txn
|
||||
TLM_DEFINE_FUNCTOR(debug_transport);
|
||||
#undef TLM_RET_VAL
|
||||
@@ -117,8 +134,9 @@ TLM_DEFINE_FUNCTOR(debug_transport);
|
||||
#undef TLM_ARG_LIST_WITHOUT_TYPES
|
||||
|
||||
#define TLM_RET_VAL bool
|
||||
#define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn, tlm::tlm_dmi& dmi
|
||||
#define TLM_ARG_LIST_WITHOUT_TYPES txn,dmi
|
||||
#define TLM_FULL_ARG_LIST \
|
||||
typename TRAITS::tlm_payload_type &txn, tlm::tlm_dmi &dmi
|
||||
#define TLM_ARG_LIST_WITHOUT_TYPES txn, dmi
|
||||
TLM_DEFINE_FUNCTOR(get_dmi_ptr);
|
||||
#undef TLM_RET_VAL
|
||||
#undef TLM_FULL_ARG_LIST
|
||||
@@ -126,7 +144,7 @@ TLM_DEFINE_FUNCTOR(get_dmi_ptr);
|
||||
|
||||
#define TLM_RET_VAL void
|
||||
#define TLM_FULL_ARG_LIST sc_dt::uint64 l, sc_dt::uint64 u
|
||||
#define TLM_ARG_LIST_WITHOUT_TYPES l,u
|
||||
#define TLM_ARG_LIST_WITHOUT_TYPES l, u
|
||||
TLM_DEFINE_FUNCTOR(invalidate_dmi);
|
||||
#undef TLM_RET_VAL
|
||||
#undef TLM_FULL_ARG_LIST
|
||||
@@ -141,108 +159,119 @@ The callbacks simply forward the fw interface call, but add the id (an int)
|
||||
of the callback binder to the signature of the call.
|
||||
*/
|
||||
template <typename TYPES>
|
||||
class callback_binder_fw
|
||||
: public tlm::tlm_fw_transport_if<TYPES>
|
||||
, protected convenience_socket_cb_holder
|
||||
class callback_binder_fw : public tlm::tlm_fw_transport_if<TYPES>,
|
||||
protected convenience_socket_cb_holder
|
||||
{
|
||||
public:
|
||||
//typedefs according to the used TYPES class
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
|
||||
//typedefs for the callbacks
|
||||
typedef nb_transport_functor<TYPES> nb_func_type;
|
||||
typedef b_transport_functor<TYPES> b_func_type;
|
||||
typedef debug_transport_functor<TYPES> debug_func_type;
|
||||
typedef get_dmi_ptr_functor<TYPES> dmi_func_type;
|
||||
// typedefs according to the used TYPES class.
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
|
||||
//ctor: an ID is needed to create a callback binder
|
||||
callback_binder_fw(multi_socket_base* owner, int id)
|
||||
: convenience_socket_cb_holder(owner), m_id(id)
|
||||
, m_nb_f(0), m_b_f(0), m_dbg_f(0), m_dmi_f(0)
|
||||
, m_caller_port(0)
|
||||
// typedefs for the callbacks.
|
||||
typedef nb_transport_functor<TYPES> nb_func_type;
|
||||
typedef b_transport_functor<TYPES> b_func_type;
|
||||
typedef debug_transport_functor<TYPES> debug_func_type;
|
||||
typedef get_dmi_ptr_functor<TYPES> dmi_func_type;
|
||||
|
||||
callback_binder_fw(multi_socket_base *owner, int id) :
|
||||
convenience_socket_cb_holder(owner), m_id(id),
|
||||
m_nb_f(0), m_b_f(0), m_dbg_f(0), m_dmi_f(0) , m_caller_port(0)
|
||||
{}
|
||||
|
||||
//the nb_transport method of the fw interface
|
||||
sync_enum_type nb_transport_fw(transaction_type& txn,
|
||||
phase_type& p,
|
||||
sc_core::sc_time& t){
|
||||
//check if a callback is registered
|
||||
if (m_nb_f && m_nb_f->is_valid()) {
|
||||
return (*m_nb_f)(m_id, txn, p, t); //do the callback
|
||||
}
|
||||
// The nb_transport method of the fw interface
|
||||
sync_enum_type nb_transport_fw(
|
||||
transaction_type &txn, phase_type &p, sc_core::sc_time &t)
|
||||
{
|
||||
// Check if a callback is registered.
|
||||
if (m_nb_f && m_nb_f->is_valid()) {
|
||||
return (*m_nb_f)(m_id, txn, p, t); // Do the callback.
|
||||
}
|
||||
|
||||
display_error("Call to nb_transport_fw without a registered callback for nb_transport_fw.");
|
||||
return tlm::TLM_COMPLETED;
|
||||
display_error("Call to nb_transport_fw without a "
|
||||
"registered callback for nb_transport_fw.");
|
||||
return tlm::TLM_COMPLETED;
|
||||
}
|
||||
|
||||
//the b_transport method of the fw interface
|
||||
void b_transport(transaction_type& trans,sc_core::sc_time& t){
|
||||
//check if a callback is registered
|
||||
if (m_b_f && m_b_f->is_valid()) {
|
||||
(*m_b_f)(m_id, trans,t); //do the callback
|
||||
return;
|
||||
}
|
||||
// The b_transport method of the fw interface.
|
||||
void
|
||||
b_transport(transaction_type &trans, sc_core::sc_time &t)
|
||||
{
|
||||
// Check if a callback is registered.
|
||||
if (m_b_f && m_b_f->is_valid()) {
|
||||
(*m_b_f)(m_id, trans, t); // Do the callback
|
||||
return;
|
||||
}
|
||||
|
||||
display_error("Call to b_transport without a registered callback for b_transport.");
|
||||
display_error("Call to b_transport without a "
|
||||
"registered callback for b_transport.");
|
||||
}
|
||||
|
||||
//the DMI method of the fw interface
|
||||
bool get_direct_mem_ptr(transaction_type& trans, tlm::tlm_dmi& dmi_data){
|
||||
//check if a callback is registered
|
||||
if (m_dmi_f && m_dmi_f->is_valid()) {
|
||||
return (*m_dmi_f)(m_id, trans,dmi_data); //do the callback
|
||||
}
|
||||
|
||||
dmi_data.allow_none();
|
||||
dmi_data.set_start_address(0x0);
|
||||
dmi_data.set_end_address((sc_dt::uint64)-1);
|
||||
return false;
|
||||
}
|
||||
|
||||
//the debug method of the fw interface
|
||||
unsigned int transport_dbg(transaction_type& trans){
|
||||
//check if a callback is registered
|
||||
if (m_dbg_f && m_dbg_f->is_valid()) {
|
||||
return (*m_dbg_f)(m_id, trans); //do the callback
|
||||
}
|
||||
// The DMI method of the fw interface.
|
||||
bool
|
||||
get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
|
||||
{
|
||||
// Check if a callback is registered.
|
||||
if (m_dmi_f && m_dmi_f->is_valid()) {
|
||||
// Do the callback.
|
||||
return (*m_dmi_f)(m_id, trans, dmi_data);
|
||||
}
|
||||
|
||||
return 0;
|
||||
dmi_data.allow_none();
|
||||
dmi_data.set_start_address(0x0);
|
||||
dmi_data.set_end_address((sc_dt::uint64)-1);
|
||||
return false;
|
||||
}
|
||||
|
||||
//the SystemC standard callback register_port:
|
||||
// - called when a port if bound to the interface
|
||||
// - allowd to find out who is bound to that callback binder
|
||||
void register_port(sc_core::sc_port_base& b, const char* /*name*/){
|
||||
m_caller_port=&b;
|
||||
|
||||
// The debug method of the fw interface.
|
||||
unsigned int
|
||||
transport_dbg(transaction_type &trans)
|
||||
{
|
||||
// check if a callback is registered
|
||||
if (m_dbg_f && m_dbg_f->is_valid()) {
|
||||
return (*m_dbg_f)(m_id, trans); // Do the callback.
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//register callbacks for all fw interface methods at once
|
||||
void set_callbacks(nb_func_type& cb1, b_func_type& cb2, dmi_func_type& cb3, debug_func_type& cb4){
|
||||
m_nb_f=&cb1;
|
||||
m_b_f=&cb2;
|
||||
m_dmi_f=&cb3;
|
||||
m_dbg_f=&cb4;
|
||||
|
||||
// The SystemC standard callback register_port:
|
||||
// - Called when a port if bound to the interface.
|
||||
// - Allowd to find out who is bound to that callback binder.
|
||||
void
|
||||
register_port(sc_core::sc_port_base &b, const char * /* name */)
|
||||
{
|
||||
m_caller_port = &b;
|
||||
}
|
||||
|
||||
//getter method to get the port that is bound to that callback binder
|
||||
// NOTE: this will only return a valid value at end of elaboration
|
||||
|
||||
// Register callbacks for all fw interface methods at once.
|
||||
void
|
||||
set_callbacks(nb_func_type &cb1, b_func_type &cb2,
|
||||
dmi_func_type &cb3, debug_func_type &cb4)
|
||||
{
|
||||
m_nb_f = &cb1;
|
||||
m_b_f = &cb2;
|
||||
m_dmi_f = &cb3;
|
||||
m_dbg_f = &cb4;
|
||||
}
|
||||
|
||||
// Getter method to get the port that is bound to that callback binder.
|
||||
// NOTE: This will only return a valid value at end of elaboration
|
||||
// (but not before end of elaboration!)
|
||||
sc_core::sc_port_base* get_other_side(){return m_caller_port;}
|
||||
|
||||
sc_core::sc_port_base *get_other_side() { return m_caller_port; }
|
||||
|
||||
private:
|
||||
//the ID of the callback binder
|
||||
int m_id;
|
||||
|
||||
//the callbacks
|
||||
nb_func_type* m_nb_f;
|
||||
b_func_type* m_b_f;
|
||||
debug_func_type* m_dbg_f;
|
||||
dmi_func_type* m_dmi_f;
|
||||
|
||||
//the port bound to that callback binder
|
||||
sc_core::sc_port_base* m_caller_port;
|
||||
// The ID of the callback binder.
|
||||
int m_id;
|
||||
|
||||
// The callbacks.
|
||||
nb_func_type *m_nb_f;
|
||||
b_func_type *m_b_f;
|
||||
debug_func_type *m_dbg_f;
|
||||
dmi_func_type *m_dmi_f;
|
||||
|
||||
// The port bound to that callback binder.
|
||||
sc_core::sc_port_base *m_caller_port;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -252,58 +281,63 @@ The callbacks simply forward the bw interface call, but add the id (an int)
|
||||
of the callback binder to the signature of the call.
|
||||
*/
|
||||
template <typename TYPES>
|
||||
class callback_binder_bw
|
||||
: public tlm::tlm_bw_transport_if<TYPES>
|
||||
, protected convenience_socket_cb_holder
|
||||
class callback_binder_bw : public tlm::tlm_bw_transport_if<TYPES>,
|
||||
protected convenience_socket_cb_holder
|
||||
{
|
||||
public:
|
||||
//typedefs according to the used TYPES class
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
|
||||
//typedefs for the callbacks
|
||||
typedef nb_transport_functor<TYPES> nb_func_type;
|
||||
// typedefs according to the used TYPES class
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
|
||||
// typedefs for the callbacks
|
||||
typedef nb_transport_functor<TYPES> nb_func_type;
|
||||
typedef invalidate_dmi_functor<TYPES> dmi_func_type;
|
||||
|
||||
//ctor: an ID is needed to create a callback binder
|
||||
callback_binder_bw(multi_socket_base* owner, int id)
|
||||
: convenience_socket_cb_holder(owner), m_id(id)
|
||||
, m_nb_f(0), m_dmi_f(0) {}
|
||||
callback_binder_bw(multi_socket_base *owner, int id) :
|
||||
convenience_socket_cb_holder(owner), m_id(id),
|
||||
m_nb_f(0), m_dmi_f(0)
|
||||
{}
|
||||
|
||||
//the nb_transport method of the bw interface
|
||||
sync_enum_type nb_transport_bw(transaction_type& txn,
|
||||
phase_type& p,
|
||||
sc_core::sc_time& t){
|
||||
//check if a callback is registered
|
||||
if (m_nb_f && m_nb_f->is_valid()) {
|
||||
return (*m_nb_f)(m_id, txn, p, t); //do the callback
|
||||
}
|
||||
// The nb_transport method of the bw interface.
|
||||
sync_enum_type
|
||||
nb_transport_bw(transaction_type &txn, phase_type& p,
|
||||
sc_core::sc_time &t)
|
||||
{
|
||||
// Check if a callback is registered.
|
||||
if (m_nb_f && m_nb_f->is_valid()) {
|
||||
return (*m_nb_f)(m_id, txn, p, t); // Do the callback.
|
||||
}
|
||||
|
||||
display_error("Call to nb_transport_bw without a registered callback for nb_transport_bw");
|
||||
return tlm::TLM_COMPLETED;
|
||||
}
|
||||
|
||||
//the DMI method of the bw interface
|
||||
void invalidate_direct_mem_ptr(sc_dt::uint64 l, sc_dt::uint64 u){
|
||||
//check if a callback is registered
|
||||
if (m_dmi_f && m_dmi_f->is_valid()) {
|
||||
(*m_dmi_f)(m_id,l,u); //do the callback
|
||||
}
|
||||
display_error("Call to nb_transport_bw without a "
|
||||
"registered callback for nb_transport_bw");
|
||||
return tlm::TLM_COMPLETED;
|
||||
}
|
||||
|
||||
//register callbacks for all bw interface methods at once
|
||||
void set_callbacks(nb_func_type& cb1, dmi_func_type& cb2){
|
||||
m_nb_f=&cb1;
|
||||
m_dmi_f=&cb2;
|
||||
// The DMI method of the bw interface.
|
||||
void
|
||||
invalidate_direct_mem_ptr(sc_dt::uint64 l, sc_dt::uint64 u)
|
||||
{
|
||||
// Check if a callback is registered.
|
||||
if (m_dmi_f && m_dmi_f->is_valid()) {
|
||||
(*m_dmi_f)(m_id,l,u); // Do the callback.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Register callbacks for all bw interface methods at once.
|
||||
void
|
||||
set_callbacks(nb_func_type &cb1, dmi_func_type &cb2)
|
||||
{
|
||||
m_nb_f = &cb1;
|
||||
m_dmi_f = &cb2;
|
||||
}
|
||||
|
||||
private:
|
||||
//the ID of the callback binder
|
||||
// The ID of the callback binder.
|
||||
int m_id;
|
||||
//the callbacks
|
||||
nb_func_type* m_nb_f;
|
||||
dmi_func_type* m_dmi_f;
|
||||
// The callbacks.
|
||||
nb_func_type *m_nb_f;
|
||||
dmi_func_type *m_dmi_f;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -311,15 +345,18 @@ This class forms the base for multi initiator sockets,
|
||||
with fewer template parameters than the multi_init_base.
|
||||
This class is implementation-defined.
|
||||
*/
|
||||
template <typename TYPES = tlm::tlm_base_protocol_types>
|
||||
class multi_init_base_if {
|
||||
public:
|
||||
//this method shall return a vector of the callback binders of multi initiator socket
|
||||
virtual std::vector<callback_binder_bw<TYPES>* >& get_binders()=0;
|
||||
//this method shall return a vector of all target interfaces bound to this multi init socket
|
||||
virtual std::vector<tlm::tlm_fw_transport_if<TYPES>*>& get_sockets()=0;
|
||||
protected:
|
||||
virtual ~multi_init_base_if() {}
|
||||
template <typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class multi_init_base_if
|
||||
{
|
||||
public:
|
||||
// This method shall return a vector of the callback binders of multi
|
||||
// initiator socket.
|
||||
virtual std::vector<callback_binder_bw<TYPES> *> &get_binders()=0;
|
||||
// This method shall return a vector of all target interfaces bound to
|
||||
// this multi init socket.
|
||||
virtual std::vector<tlm::tlm_fw_transport_if<TYPES> *> &get_sockets()=0;
|
||||
protected:
|
||||
virtual ~multi_init_base_if() {}
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -327,40 +364,40 @@ This class forms the base for multi initiator sockets.
|
||||
It enforces a multi initiator socket to implement all functions
|
||||
needed to do hierarchical bindings.
|
||||
*/
|
||||
template <unsigned int BUSWIDTH = 32,
|
||||
typename TYPES = tlm::tlm_base_protocol_types,
|
||||
unsigned int N=0,
|
||||
sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class multi_init_base
|
||||
: public tlm::tlm_initiator_socket<BUSWIDTH, TYPES, N, POL>
|
||||
, public multi_init_base_if<TYPES>
|
||||
, protected multi_socket_base
|
||||
template <unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types, unsigned int N=0,
|
||||
sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class multi_init_base :
|
||||
public tlm::tlm_initiator_socket<BUSWIDTH, TYPES, N, POL>,
|
||||
public multi_init_base_if<TYPES>, protected multi_socket_base
|
||||
{
|
||||
public:
|
||||
//typedef for the base type: the standard tlm initiator socket
|
||||
typedef tlm::tlm_initiator_socket<BUSWIDTH, TYPES, N, POL> base_type;
|
||||
|
||||
//this method shall disable the code that does the callback binding
|
||||
// that registers callbacks to binders
|
||||
virtual void disable_cb_bind()=0;
|
||||
|
||||
//this method shall return the multi_init_base to which the
|
||||
// multi_init_base is bound hierarchically
|
||||
// If the base is not bound hierarchically it shall return a pointer to itself
|
||||
virtual multi_init_base* get_hierarch_bind()=0;
|
||||
|
||||
virtual tlm::tlm_socket_category get_socket_category() const
|
||||
{
|
||||
return tlm::TLM_MULTI_INITIATOR_SOCKET;
|
||||
}
|
||||
public:
|
||||
// typedef for the base type: the standard tlm initiator socket.
|
||||
typedef tlm::tlm_initiator_socket<BUSWIDTH, TYPES, N, POL> base_type;
|
||||
|
||||
//ctor and dtor
|
||||
virtual ~multi_init_base(){}
|
||||
multi_init_base():base_type(sc_core::sc_gen_unique_name("multi_init_base")){}
|
||||
multi_init_base(const char* name):base_type(name){}
|
||||
// This method shall disable the code that does the callback binding
|
||||
// that registers callbacks to binders.
|
||||
virtual void disable_cb_bind()=0;
|
||||
|
||||
private:
|
||||
const sc_core::sc_object* get_socket() const { return this; }
|
||||
// This method shall return the multi_init_base to which the
|
||||
// multi_init_base is bound hierarchically. If the base is not bound
|
||||
// hierarchically it shall return a pointer to itself.
|
||||
virtual multi_init_base *get_hierarch_bind() = 0;
|
||||
|
||||
virtual tlm::tlm_socket_category
|
||||
get_socket_category() const
|
||||
{
|
||||
return tlm::TLM_MULTI_INITIATOR_SOCKET;
|
||||
}
|
||||
|
||||
virtual ~multi_init_base() {}
|
||||
multi_init_base() :
|
||||
base_type(sc_core::sc_gen_unique_name("multi_init_base"))
|
||||
{}
|
||||
multi_init_base(const char *name) : base_type(name) {}
|
||||
|
||||
private:
|
||||
const sc_core::sc_object *get_socket() const { return this; }
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -368,19 +405,23 @@ This class forms the base for multi target sockets,
|
||||
with fewer template parameters than the multi_target_base.
|
||||
This class is implementation-defined.
|
||||
*/
|
||||
template <typename TYPES = tlm::tlm_base_protocol_types>
|
||||
class multi_target_base_if {
|
||||
public:
|
||||
//this method shall return a vector of the callback binders of multi initiator socket
|
||||
virtual std::vector<callback_binder_fw<TYPES>* >& get_binders()=0;
|
||||
|
||||
//this method shall return a map of all multi initiator sockets that are
|
||||
// bound to this multi target the key of the map is the index at which the
|
||||
// multi initiator i bound, while the value is the interface of the multi
|
||||
// initiator socket that is bound at that index
|
||||
virtual std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*>& get_multi_binds()=0;
|
||||
protected:
|
||||
virtual ~multi_target_base_if() {}
|
||||
template <typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class multi_target_base_if
|
||||
{
|
||||
public:
|
||||
// This method shall return a vector of the callback binders of multi
|
||||
// initiator socket.
|
||||
virtual std::vector<callback_binder_fw<TYPES> *> &get_binders() = 0;
|
||||
|
||||
// This method shall return a map of all multi initiator sockets that are
|
||||
// bound to this multi target the key of the map is the index at which the
|
||||
// multi initiator i bound, while the value is the interface of the multi
|
||||
// initiator socket that is bound at that index.
|
||||
virtual std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*> &
|
||||
get_multi_binds() = 0;
|
||||
|
||||
protected:
|
||||
virtual ~multi_target_base_if() {}
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -388,53 +429,57 @@ This class forms the base for multi target sockets.
|
||||
It enforces a multi target socket to implement all functions
|
||||
needed to do hierarchical bindings.
|
||||
*/
|
||||
template <unsigned int BUSWIDTH = 32,
|
||||
typename TYPES = tlm::tlm_base_protocol_types,
|
||||
unsigned int N=0,
|
||||
sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class multi_target_base
|
||||
: public tlm::tlm_target_socket<BUSWIDTH, TYPES, N, POL>
|
||||
, public multi_target_base_if<TYPES>
|
||||
, protected multi_socket_base
|
||||
template <unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types, unsigned int N=0,
|
||||
sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class multi_target_base :
|
||||
public tlm::tlm_target_socket<BUSWIDTH, TYPES, N, POL>,
|
||||
public multi_target_base_if<TYPES>, protected multi_socket_base
|
||||
{
|
||||
public:
|
||||
//typedef for the base type: the standard tlm target socket
|
||||
typedef tlm::tlm_target_socket<BUSWIDTH, TYPES, N, POL > base_type;
|
||||
|
||||
//this method shall return the multi_init_base to which the
|
||||
// multi_init_base is bound hierarchically
|
||||
// If the base is not bound hierarchically it shall return a pointer to itself
|
||||
virtual multi_target_base* get_hierarch_bind()=0;
|
||||
|
||||
//this method shall inform the multi target socket that it is bound
|
||||
// hierarchically and to which other multi target socket it is bound hierarchically
|
||||
virtual void set_hierarch_bind(multi_target_base*)=0;
|
||||
public:
|
||||
// Typedef for the base type: the standard tlm target socket.
|
||||
typedef tlm::tlm_target_socket<BUSWIDTH, TYPES, N, POL > base_type;
|
||||
|
||||
virtual tlm::tlm_socket_category get_socket_category() const
|
||||
{
|
||||
return tlm::TLM_MULTI_TARGET_SOCKET;
|
||||
}
|
||||
// This method shall return the multi_init_base to which the
|
||||
// multi_init_base is bound hierarchically. If the base is not bound
|
||||
// hierarchically it shall return a pointer to itself.
|
||||
virtual multi_target_base *get_hierarch_bind() = 0;
|
||||
|
||||
//ctor and dtor
|
||||
virtual ~multi_target_base(){}
|
||||
multi_target_base():base_type(sc_core::sc_gen_unique_name("multi_target_base")){}
|
||||
multi_target_base(const char* name):base_type(name){}
|
||||
// This method shall inform the multi target socket that it is bound
|
||||
// hierarchically and to which other multi target socket it is bound
|
||||
// hierarchically.
|
||||
virtual void set_hierarch_bind(multi_target_base*) = 0;
|
||||
|
||||
private:
|
||||
const sc_core::sc_object* get_socket() const { return this; }
|
||||
virtual tlm::tlm_socket_category
|
||||
get_socket_category() const
|
||||
{
|
||||
return tlm::TLM_MULTI_TARGET_SOCKET;
|
||||
}
|
||||
|
||||
virtual ~multi_target_base() {}
|
||||
multi_target_base() :
|
||||
base_type(sc_core::sc_gen_unique_name("multi_target_base"))
|
||||
{}
|
||||
multi_target_base(const char *name) : base_type(name) {}
|
||||
|
||||
private:
|
||||
const sc_core::sc_object *get_socket() const { return this; }
|
||||
};
|
||||
|
||||
/*
|
||||
All multi sockets must additionally derive from this class.
|
||||
It enforces a multi socket to implement a function
|
||||
It enforces a multi socket to implement a function
|
||||
needed to do multi init to multi target bindings.
|
||||
*/
|
||||
template <typename TYPES>
|
||||
class multi_to_multi_bind_base{
|
||||
public:
|
||||
virtual ~multi_to_multi_bind_base(){}
|
||||
virtual tlm::tlm_fw_transport_if<TYPES>* get_last_binder(tlm::tlm_bw_transport_if<TYPES>*)=0;
|
||||
class multi_to_multi_bind_base
|
||||
{
|
||||
public:
|
||||
virtual ~multi_to_multi_bind_base() {}
|
||||
virtual tlm::tlm_fw_transport_if<TYPES> *
|
||||
get_last_binder(tlm::tlm_bw_transport_if<TYPES> *) = 0;
|
||||
};
|
||||
|
||||
} // namespace tlm_utils
|
||||
#endif // TLM_UTILS_MULTI_SOCKET_BASES_H_INCLUDED_
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_MULTI_SOCKET_BASES_H__ */
|
||||
|
||||
@@ -17,461 +17,497 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
|
||||
#define TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H__
|
||||
|
||||
#include <tlm>
|
||||
#include "tlm_utils/convenience_socket_bases.h"
|
||||
|
||||
namespace tlm_utils {
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH, typename TYPES
|
||||
, sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND >
|
||||
class passthrough_target_socket_b
|
||||
: public tlm::tlm_target_socket<BUSWIDTH, TYPES, 1, POL>
|
||||
, protected passthrough_socket_base
|
||||
namespace tlm_utils
|
||||
{
|
||||
public:
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
|
||||
typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
|
||||
typedef tlm::tlm_target_socket<BUSWIDTH,TYPES,1,POL> base_type;
|
||||
|
||||
public:
|
||||
static const char* default_name()
|
||||
{ return sc_core::sc_gen_unique_name("passthrough_target_socket"); }
|
||||
|
||||
explicit passthrough_target_socket_b(const char* n = default_name())
|
||||
: base_type(n)
|
||||
, m_process(this)
|
||||
{
|
||||
bind(m_process);
|
||||
}
|
||||
|
||||
using base_type::bind;
|
||||
|
||||
// REGISTER_XXX
|
||||
void register_nb_transport_fw(MODULE* mod,
|
||||
sync_enum_type (MODULE::*cb)(transaction_type&,
|
||||
phase_type&,
|
||||
sc_core::sc_time&))
|
||||
{
|
||||
m_process.set_nb_transport_ptr(mod, cb);
|
||||
}
|
||||
|
||||
void register_b_transport(MODULE* mod,
|
||||
void (MODULE::*cb)(transaction_type&,
|
||||
sc_core::sc_time&))
|
||||
{
|
||||
m_process.set_b_transport_ptr(mod, cb);
|
||||
}
|
||||
|
||||
void register_transport_dbg(MODULE* mod,
|
||||
unsigned int (MODULE::*cb)(transaction_type&))
|
||||
{
|
||||
m_process.set_transport_dbg_ptr(mod, cb);
|
||||
}
|
||||
|
||||
void register_get_direct_mem_ptr(MODULE* mod,
|
||||
bool (MODULE::*cb)(transaction_type&,
|
||||
tlm::tlm_dmi&))
|
||||
{
|
||||
m_process.set_get_direct_mem_ptr(mod, cb);
|
||||
}
|
||||
|
||||
private:
|
||||
class process
|
||||
: public tlm::tlm_fw_transport_if<TYPES>
|
||||
, protected convenience_socket_cb_holder
|
||||
{
|
||||
template <typename MODULE, unsigned int BUSWIDTH, typename TYPES,
|
||||
sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class passthrough_target_socket_b :
|
||||
public tlm::tlm_target_socket<BUSWIDTH, TYPES, 1, POL>,
|
||||
protected passthrough_socket_base
|
||||
{
|
||||
public:
|
||||
typedef sync_enum_type (MODULE::*NBTransportPtr)(transaction_type&,
|
||||
phase_type&,
|
||||
sc_core::sc_time&);
|
||||
typedef void (MODULE::*BTransportPtr)(transaction_type&,
|
||||
sc_core::sc_time&);
|
||||
typedef unsigned int (MODULE::*TransportDbgPtr)(transaction_type&);
|
||||
typedef bool (MODULE::*GetDirectMem_ptr)(transaction_type&,
|
||||
tlm::tlm_dmi&);
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
|
||||
typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
|
||||
typedef tlm::tlm_target_socket<BUSWIDTH,TYPES,1,POL> base_type;
|
||||
|
||||
explicit process(passthrough_socket_base* owner)
|
||||
: convenience_socket_cb_holder(owner), m_mod(0)
|
||||
, m_nb_transport_ptr(0)
|
||||
, m_b_transport_ptr(0)
|
||||
, m_transport_dbg_ptr(0)
|
||||
, m_get_direct_mem_ptr(0)
|
||||
public:
|
||||
static const char *
|
||||
default_name()
|
||||
{
|
||||
}
|
||||
|
||||
void set_nb_transport_ptr(MODULE* mod, NBTransportPtr p)
|
||||
{
|
||||
if (m_nb_transport_ptr) {
|
||||
display_warning("non-blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_nb_transport_ptr = p;
|
||||
return sc_core::sc_gen_unique_name("passthrough_target_socket");
|
||||
}
|
||||
|
||||
void set_b_transport_ptr(MODULE* mod, BTransportPtr p)
|
||||
explicit passthrough_target_socket_b(const char *n=default_name()) :
|
||||
base_type(n), m_process(this)
|
||||
{
|
||||
if (m_b_transport_ptr) {
|
||||
display_warning("blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_b_transport_ptr = p;
|
||||
bind(m_process);
|
||||
}
|
||||
|
||||
void set_transport_dbg_ptr(MODULE* mod, TransportDbgPtr p)
|
||||
using base_type::bind;
|
||||
|
||||
// REGISTER_XXX
|
||||
void
|
||||
register_nb_transport_fw(MODULE *mod,
|
||||
sync_enum_type (MODULE::*cb)(transaction_type &, phase_type &,
|
||||
sc_core::sc_time &))
|
||||
{
|
||||
if (m_transport_dbg_ptr) {
|
||||
display_warning("debug callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_transport_dbg_ptr = p;
|
||||
m_process.set_nb_transport_ptr(mod, cb);
|
||||
}
|
||||
|
||||
void set_get_direct_mem_ptr(MODULE* mod, GetDirectMem_ptr p)
|
||||
void
|
||||
register_b_transport(MODULE *mod,
|
||||
void (MODULE::*cb)(transaction_type &, sc_core::sc_time &))
|
||||
{
|
||||
if (m_get_direct_mem_ptr) {
|
||||
display_warning("get DMI pointer callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_get_direct_mem_ptr = p;
|
||||
m_process.set_b_transport_ptr(mod, cb);
|
||||
}
|
||||
|
||||
sync_enum_type nb_transport_fw(transaction_type& trans,
|
||||
phase_type& phase,
|
||||
sc_core::sc_time& t)
|
||||
void
|
||||
register_transport_dbg(MODULE *mod,
|
||||
unsigned int (MODULE::*cb)(transaction_type &))
|
||||
{
|
||||
if (m_nb_transport_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_nb_transport_ptr)(trans, phase, t);
|
||||
}
|
||||
display_error("no non-blocking callback registered");
|
||||
return tlm::TLM_COMPLETED;
|
||||
m_process.set_transport_dbg_ptr(mod, cb);
|
||||
}
|
||||
|
||||
void b_transport(transaction_type& trans, sc_core::sc_time& t)
|
||||
void
|
||||
register_get_direct_mem_ptr(MODULE *mod,
|
||||
bool (MODULE::*cb)(transaction_type &, tlm::tlm_dmi &))
|
||||
{
|
||||
if (m_b_transport_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_b_transport_ptr)(trans, t);
|
||||
}
|
||||
display_error("no blocking callback registered");
|
||||
}
|
||||
|
||||
unsigned int transport_dbg(transaction_type& trans)
|
||||
{
|
||||
if (m_transport_dbg_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_transport_dbg_ptr)(trans);
|
||||
}
|
||||
// No debug support
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool get_direct_mem_ptr(transaction_type& trans,
|
||||
tlm::tlm_dmi& dmi_data)
|
||||
{
|
||||
if (m_get_direct_mem_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_get_direct_mem_ptr)(trans, dmi_data);
|
||||
}
|
||||
// No DMI support
|
||||
dmi_data.allow_read_write();
|
||||
dmi_data.set_start_address(0x0);
|
||||
dmi_data.set_end_address((sc_dt::uint64)-1);
|
||||
return false;
|
||||
m_process.set_get_direct_mem_ptr(mod, cb);
|
||||
}
|
||||
|
||||
private:
|
||||
MODULE* m_mod;
|
||||
NBTransportPtr m_nb_transport_ptr;
|
||||
BTransportPtr m_b_transport_ptr;
|
||||
TransportDbgPtr m_transport_dbg_ptr;
|
||||
GetDirectMem_ptr m_get_direct_mem_ptr;
|
||||
};
|
||||
class process : public tlm::tlm_fw_transport_if<TYPES>,
|
||||
protected convenience_socket_cb_holder
|
||||
{
|
||||
public:
|
||||
typedef sync_enum_type (MODULE::*NBTransportPtr)(
|
||||
transaction_type &, phase_type &, sc_core::sc_time &);
|
||||
typedef void (MODULE::*BTransportPtr)(
|
||||
transaction_type &, sc_core::sc_time &);
|
||||
typedef unsigned int (MODULE::*TransportDbgPtr)(transaction_type &);
|
||||
typedef bool (MODULE::*GetDirectMem_ptr)(
|
||||
transaction_type &, tlm::tlm_dmi &);
|
||||
|
||||
private:
|
||||
const sc_core::sc_object* get_socket() const { return this; }
|
||||
private:
|
||||
process m_process;
|
||||
explicit process(passthrough_socket_base *owner) :
|
||||
convenience_socket_cb_holder(owner), m_mod(0),
|
||||
m_nb_transport_ptr(0), m_b_transport_ptr(0),
|
||||
m_transport_dbg_ptr(0), m_get_direct_mem_ptr(0)
|
||||
{}
|
||||
|
||||
void
|
||||
set_nb_transport_ptr(MODULE *mod, NBTransportPtr p)
|
||||
{
|
||||
if (m_nb_transport_ptr) {
|
||||
display_warning("non-blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_nb_transport_ptr = p;
|
||||
}
|
||||
|
||||
void
|
||||
set_b_transport_ptr(MODULE *mod, BTransportPtr p)
|
||||
{
|
||||
if (m_b_transport_ptr) {
|
||||
display_warning("blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_b_transport_ptr = p;
|
||||
}
|
||||
|
||||
void
|
||||
set_transport_dbg_ptr(MODULE *mod, TransportDbgPtr p)
|
||||
{
|
||||
if (m_transport_dbg_ptr) {
|
||||
display_warning("debug callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_transport_dbg_ptr = p;
|
||||
}
|
||||
|
||||
void
|
||||
set_get_direct_mem_ptr(MODULE *mod, GetDirectMem_ptr p)
|
||||
{
|
||||
if (m_get_direct_mem_ptr) {
|
||||
display_warning(
|
||||
"get DMI pointer callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_get_direct_mem_ptr = p;
|
||||
}
|
||||
|
||||
sync_enum_type nb_transport_fw(
|
||||
transaction_type &trans, phase_type &phase,
|
||||
sc_core::sc_time &t)
|
||||
{
|
||||
if (m_nb_transport_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_nb_transport_ptr)(trans, phase, t);
|
||||
}
|
||||
display_error("no non-blocking callback registered");
|
||||
return tlm::TLM_COMPLETED;
|
||||
}
|
||||
|
||||
void
|
||||
b_transport(transaction_type &trans, sc_core::sc_time &t)
|
||||
{
|
||||
if (m_b_transport_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_b_transport_ptr)(trans, t);
|
||||
}
|
||||
display_error("no blocking callback registered");
|
||||
}
|
||||
|
||||
unsigned int
|
||||
transport_dbg(transaction_type &trans)
|
||||
{
|
||||
if (m_transport_dbg_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_transport_dbg_ptr)(trans);
|
||||
}
|
||||
// No debug support
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool
|
||||
get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
|
||||
{
|
||||
if (m_get_direct_mem_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_get_direct_mem_ptr)(trans, dmi_data);
|
||||
}
|
||||
// No DMI support
|
||||
dmi_data.allow_read_write();
|
||||
dmi_data.set_start_address(0x0);
|
||||
dmi_data.set_end_address((sc_dt::uint64)-1);
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
MODULE *m_mod;
|
||||
NBTransportPtr m_nb_transport_ptr;
|
||||
BTransportPtr m_b_transport_ptr;
|
||||
TransportDbgPtr m_transport_dbg_ptr;
|
||||
GetDirectMem_ptr m_get_direct_mem_ptr;
|
||||
};
|
||||
|
||||
private:
|
||||
const sc_core::sc_object *get_socket() const { return this; }
|
||||
|
||||
private:
|
||||
process m_process;
|
||||
};
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH = 32
|
||||
, typename TYPES = tlm::tlm_base_protocol_types >
|
||||
class passthrough_target_socket
|
||||
: public passthrough_target_socket_b<MODULE,BUSWIDTH,TYPES>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class passthrough_target_socket :
|
||||
public passthrough_target_socket_b<MODULE, BUSWIDTH, TYPES>
|
||||
{
|
||||
typedef passthrough_target_socket_b<MODULE,BUSWIDTH,TYPES> socket_b;
|
||||
public:
|
||||
passthrough_target_socket() : socket_b() {}
|
||||
explicit passthrough_target_socket(const char* name) : socket_b(name) {}
|
||||
};
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH = 32
|
||||
, typename TYPES = tlm::tlm_base_protocol_types >
|
||||
class passthrough_target_socket_optional
|
||||
: public passthrough_target_socket_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
{
|
||||
typedef passthrough_target_socket_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
passthrough_target_socket_optional() : socket_b() {}
|
||||
explicit passthrough_target_socket_optional(const char* name) : socket_b(name) {}
|
||||
};
|
||||
|
||||
//ID Tagged version
|
||||
template< typename MODULE, unsigned int BUSWIDTH, typename TYPES
|
||||
, sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND >
|
||||
class passthrough_target_socket_tagged_b
|
||||
: public tlm::tlm_target_socket<BUSWIDTH, TYPES, 1, POL>
|
||||
, protected passthrough_socket_base
|
||||
{
|
||||
public:
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
|
||||
typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
|
||||
typedef tlm::tlm_target_socket<BUSWIDTH,TYPES,1,POL> base_type;
|
||||
|
||||
static const char* default_name()
|
||||
{ return sc_core::sc_gen_unique_name("passthrough_target_socket_tagged"); }
|
||||
|
||||
public:
|
||||
explicit passthrough_target_socket_tagged_b(const char* n = default_name())
|
||||
: base_type(n)
|
||||
, m_process(this)
|
||||
{
|
||||
bind(m_process);
|
||||
}
|
||||
|
||||
using base_type::bind;
|
||||
|
||||
// REGISTER_XXX
|
||||
void register_nb_transport_fw(MODULE* mod,
|
||||
sync_enum_type (MODULE::*cb)(int id,
|
||||
transaction_type&,
|
||||
phase_type&,
|
||||
sc_core::sc_time&),
|
||||
int id)
|
||||
{
|
||||
m_process.set_nb_transport_ptr(mod, cb);
|
||||
m_process.set_nb_transport_user_id(id);
|
||||
}
|
||||
|
||||
void register_b_transport(MODULE* mod,
|
||||
void (MODULE::*cb)(int id,
|
||||
transaction_type&,
|
||||
sc_core::sc_time&),
|
||||
int id)
|
||||
{
|
||||
m_process.set_b_transport_ptr(mod, cb);
|
||||
m_process.set_b_transport_user_id(id);
|
||||
}
|
||||
|
||||
void register_transport_dbg(MODULE* mod,
|
||||
unsigned int (MODULE::*cb)(int id,
|
||||
transaction_type&),
|
||||
int id)
|
||||
{
|
||||
m_process.set_transport_dbg_ptr(mod, cb);
|
||||
m_process.set_transport_dbg_user_id(id);
|
||||
}
|
||||
|
||||
void register_get_direct_mem_ptr(MODULE* mod,
|
||||
bool (MODULE::*cb)(int id,
|
||||
transaction_type&,
|
||||
tlm::tlm_dmi&),
|
||||
int id)
|
||||
{
|
||||
m_process.set_get_direct_mem_ptr(mod, cb);
|
||||
m_process.set_get_dmi_user_id(id);
|
||||
}
|
||||
|
||||
private:
|
||||
class process
|
||||
: public tlm::tlm_fw_transport_if<TYPES>
|
||||
, protected convenience_socket_cb_holder
|
||||
{
|
||||
typedef passthrough_target_socket_b<MODULE, BUSWIDTH, TYPES> socket_b;
|
||||
public:
|
||||
typedef sync_enum_type (MODULE::*NBTransportPtr)(int id,
|
||||
transaction_type&,
|
||||
phase_type&,
|
||||
sc_core::sc_time&);
|
||||
typedef void (MODULE::*BTransportPtr)(int id,
|
||||
transaction_type&,
|
||||
sc_core::sc_time&);
|
||||
typedef unsigned int (MODULE::*TransportDbgPtr)(int id,
|
||||
transaction_type&);
|
||||
typedef bool (MODULE::*GetDirectMem_ptr)(int id,
|
||||
transaction_type&,
|
||||
tlm::tlm_dmi&);
|
||||
passthrough_target_socket() : socket_b() {}
|
||||
explicit passthrough_target_socket(const char *name) : socket_b(name) {}
|
||||
};
|
||||
|
||||
process(passthrough_socket_base* owner)
|
||||
: convenience_socket_cb_holder(owner), m_mod(0)
|
||||
, m_nb_transport_ptr(0)
|
||||
, m_b_transport_ptr(0)
|
||||
, m_transport_dbg_ptr(0)
|
||||
, m_get_direct_mem_ptr(0)
|
||||
, m_nb_transport_user_id(0)
|
||||
, m_b_transport_user_id(0)
|
||||
, m_transport_dbg_user_id(0)
|
||||
, m_get_dmi_user_id(0)
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class passthrough_target_socket_optional :
|
||||
public passthrough_target_socket_b<
|
||||
MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
{
|
||||
typedef passthrough_target_socket_b<
|
||||
MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
passthrough_target_socket_optional() : socket_b() {}
|
||||
explicit passthrough_target_socket_optional(const char *name) :
|
||||
socket_b(name) {}
|
||||
};
|
||||
|
||||
// ID Tagged version
|
||||
template <typename MODULE, unsigned int BUSWIDTH, typename TYPES,
|
||||
sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class passthrough_target_socket_tagged_b :
|
||||
public tlm::tlm_target_socket<BUSWIDTH, TYPES, 1, POL>,
|
||||
protected passthrough_socket_base
|
||||
{
|
||||
public:
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
|
||||
typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
|
||||
typedef tlm::tlm_target_socket<BUSWIDTH, TYPES, 1, POL> base_type;
|
||||
|
||||
static const char *
|
||||
default_name()
|
||||
{
|
||||
return sc_core::sc_gen_unique_name(
|
||||
"passthrough_target_socket_tagged");
|
||||
}
|
||||
|
||||
void set_nb_transport_user_id(int id) { m_nb_transport_user_id = id; }
|
||||
void set_b_transport_user_id(int id) { m_b_transport_user_id = id; }
|
||||
void set_transport_dbg_user_id(int id) { m_transport_dbg_user_id = id; }
|
||||
void set_get_dmi_user_id(int id) { m_get_dmi_user_id = id; }
|
||||
|
||||
void set_nb_transport_ptr(MODULE* mod, NBTransportPtr p)
|
||||
public:
|
||||
explicit passthrough_target_socket_tagged_b(
|
||||
const char *n=default_name()) : base_type(n), m_process(this)
|
||||
{
|
||||
if (m_nb_transport_ptr) {
|
||||
display_warning("non-blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_nb_transport_ptr = p;
|
||||
bind(m_process);
|
||||
}
|
||||
|
||||
void set_b_transport_ptr(MODULE* mod, BTransportPtr p)
|
||||
using base_type::bind;
|
||||
|
||||
// REGISTER_XXX
|
||||
void
|
||||
register_nb_transport_fw(MODULE *mod,
|
||||
sync_enum_type (MODULE::*cb)(int id, transaction_type &,
|
||||
phase_type &, sc_core::sc_time &),
|
||||
int id)
|
||||
{
|
||||
if (m_b_transport_ptr) {
|
||||
display_warning("blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_b_transport_ptr = p;
|
||||
m_process.set_nb_transport_ptr(mod, cb);
|
||||
m_process.set_nb_transport_user_id(id);
|
||||
}
|
||||
|
||||
void set_transport_dbg_ptr(MODULE* mod, TransportDbgPtr p)
|
||||
void
|
||||
register_b_transport(MODULE *mod,
|
||||
void (MODULE::*cb)(int id, transaction_type &,
|
||||
sc_core::sc_time &),
|
||||
int id)
|
||||
{
|
||||
if (m_transport_dbg_ptr) {
|
||||
display_warning("debug callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_transport_dbg_ptr = p;
|
||||
m_process.set_b_transport_ptr(mod, cb);
|
||||
m_process.set_b_transport_user_id(id);
|
||||
}
|
||||
|
||||
void set_get_direct_mem_ptr(MODULE* mod, GetDirectMem_ptr p)
|
||||
void
|
||||
register_transport_dbg(MODULE *mod,
|
||||
unsigned int (MODULE::*cb)(int id, transaction_type &), int id)
|
||||
{
|
||||
if (m_get_direct_mem_ptr) {
|
||||
display_warning("get DMI pointer callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_get_direct_mem_ptr = p;
|
||||
m_process.set_transport_dbg_ptr(mod, cb);
|
||||
m_process.set_transport_dbg_user_id(id);
|
||||
}
|
||||
|
||||
sync_enum_type nb_transport_fw(transaction_type& trans,
|
||||
phase_type& phase,
|
||||
sc_core::sc_time& t)
|
||||
void
|
||||
register_get_direct_mem_ptr(MODULE *mod,
|
||||
bool (MODULE::*cb)(int id, transaction_type &, tlm::tlm_dmi &),
|
||||
int id)
|
||||
{
|
||||
if (m_nb_transport_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_nb_transport_ptr)(m_nb_transport_user_id, trans, phase, t);
|
||||
}
|
||||
display_error("no non-blocking callback registered");
|
||||
return tlm::TLM_COMPLETED;
|
||||
}
|
||||
|
||||
void b_transport(transaction_type& trans, sc_core::sc_time& t)
|
||||
{
|
||||
if (m_b_transport_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_b_transport_ptr)(m_b_transport_user_id, trans, t);
|
||||
}
|
||||
display_error("no blocking callback registered");
|
||||
}
|
||||
|
||||
unsigned int transport_dbg(transaction_type& trans)
|
||||
{
|
||||
if (m_transport_dbg_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_transport_dbg_ptr)(m_transport_dbg_user_id, trans);
|
||||
}
|
||||
// No debug support
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool get_direct_mem_ptr(transaction_type& trans,
|
||||
tlm::tlm_dmi& dmi_data)
|
||||
{
|
||||
if (m_get_direct_mem_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_get_direct_mem_ptr)(m_get_dmi_user_id, trans, dmi_data);
|
||||
}
|
||||
// No DMI support
|
||||
dmi_data.allow_read_write();
|
||||
dmi_data.set_start_address(0x0);
|
||||
dmi_data.set_end_address((sc_dt::uint64)-1);
|
||||
return false;
|
||||
m_process.set_get_direct_mem_ptr(mod, cb);
|
||||
m_process.set_get_dmi_user_id(id);
|
||||
}
|
||||
|
||||
private:
|
||||
MODULE* m_mod;
|
||||
NBTransportPtr m_nb_transport_ptr;
|
||||
BTransportPtr m_b_transport_ptr;
|
||||
TransportDbgPtr m_transport_dbg_ptr;
|
||||
GetDirectMem_ptr m_get_direct_mem_ptr;
|
||||
int m_nb_transport_user_id;
|
||||
int m_b_transport_user_id;
|
||||
int m_transport_dbg_user_id;
|
||||
int m_get_dmi_user_id;
|
||||
};
|
||||
class process : public tlm::tlm_fw_transport_if<TYPES>,
|
||||
protected convenience_socket_cb_holder
|
||||
{
|
||||
public:
|
||||
typedef sync_enum_type (MODULE::*NBTransportPtr)(
|
||||
int id, transaction_type &, phase_type &, sc_core::sc_time &);
|
||||
typedef void (MODULE::*BTransportPtr)(
|
||||
int id, transaction_type &, sc_core::sc_time &);
|
||||
typedef unsigned int (MODULE::*TransportDbgPtr)(
|
||||
int id, transaction_type &);
|
||||
typedef bool (MODULE::*GetDirectMem_ptr)(
|
||||
int id, transaction_type &, tlm::tlm_dmi &);
|
||||
|
||||
private:
|
||||
const sc_core::sc_object* get_socket() const { return this; }
|
||||
private:
|
||||
process m_process;
|
||||
process(passthrough_socket_base *owner) :
|
||||
convenience_socket_cb_holder(owner), m_mod(0),
|
||||
m_nb_transport_ptr(0), m_b_transport_ptr(0),
|
||||
m_transport_dbg_ptr(0), m_get_direct_mem_ptr(0),
|
||||
m_nb_transport_user_id(0), m_b_transport_user_id(0),
|
||||
m_transport_dbg_user_id(0), m_get_dmi_user_id(0)
|
||||
{}
|
||||
|
||||
void
|
||||
set_nb_transport_user_id(int id)
|
||||
{
|
||||
m_nb_transport_user_id = id;
|
||||
}
|
||||
void
|
||||
set_b_transport_user_id(int id)
|
||||
{
|
||||
m_b_transport_user_id = id;
|
||||
}
|
||||
void
|
||||
set_transport_dbg_user_id(int id)
|
||||
{
|
||||
m_transport_dbg_user_id = id;
|
||||
}
|
||||
void
|
||||
set_get_dmi_user_id(int id)
|
||||
{
|
||||
m_get_dmi_user_id = id;
|
||||
}
|
||||
|
||||
void
|
||||
set_nb_transport_ptr(MODULE *mod, NBTransportPtr p)
|
||||
{
|
||||
if (m_nb_transport_ptr) {
|
||||
display_warning("non-blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_nb_transport_ptr = p;
|
||||
}
|
||||
|
||||
void
|
||||
set_b_transport_ptr(MODULE *mod, BTransportPtr p)
|
||||
{
|
||||
if (m_b_transport_ptr) {
|
||||
display_warning("blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_b_transport_ptr = p;
|
||||
}
|
||||
|
||||
void
|
||||
set_transport_dbg_ptr(MODULE *mod, TransportDbgPtr p)
|
||||
{
|
||||
if (m_transport_dbg_ptr) {
|
||||
display_warning("debug callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_transport_dbg_ptr = p;
|
||||
}
|
||||
|
||||
void
|
||||
set_get_direct_mem_ptr(MODULE *mod, GetDirectMem_ptr p)
|
||||
{
|
||||
if (m_get_direct_mem_ptr) {
|
||||
display_warning(
|
||||
"get DMI pointer callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_get_direct_mem_ptr = p;
|
||||
}
|
||||
|
||||
sync_enum_type
|
||||
nb_transport_fw(transaction_type &trans, phase_type &phase,
|
||||
sc_core::sc_time &t)
|
||||
{
|
||||
if (m_nb_transport_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_nb_transport_ptr)(
|
||||
m_nb_transport_user_id, trans, phase, t);
|
||||
}
|
||||
display_error("no non-blocking callback registered");
|
||||
return tlm::TLM_COMPLETED;
|
||||
}
|
||||
|
||||
void
|
||||
b_transport(transaction_type &trans, sc_core::sc_time &t)
|
||||
{
|
||||
if (m_b_transport_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_b_transport_ptr)(
|
||||
m_b_transport_user_id, trans, t);
|
||||
}
|
||||
display_error("no blocking callback registered");
|
||||
}
|
||||
|
||||
unsigned int
|
||||
transport_dbg(transaction_type &trans)
|
||||
{
|
||||
if (m_transport_dbg_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_transport_dbg_ptr)(
|
||||
m_transport_dbg_user_id, trans);
|
||||
}
|
||||
// No debug support.
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool
|
||||
get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
|
||||
{
|
||||
if (m_get_direct_mem_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_get_direct_mem_ptr)(
|
||||
m_get_dmi_user_id, trans, dmi_data);
|
||||
}
|
||||
// No DMI support
|
||||
dmi_data.allow_read_write();
|
||||
dmi_data.set_start_address(0x0);
|
||||
dmi_data.set_end_address((sc_dt::uint64)-1);
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
MODULE *m_mod;
|
||||
NBTransportPtr m_nb_transport_ptr;
|
||||
BTransportPtr m_b_transport_ptr;
|
||||
TransportDbgPtr m_transport_dbg_ptr;
|
||||
GetDirectMem_ptr m_get_direct_mem_ptr;
|
||||
int m_nb_transport_user_id;
|
||||
int m_b_transport_user_id;
|
||||
int m_transport_dbg_user_id;
|
||||
int m_get_dmi_user_id;
|
||||
};
|
||||
|
||||
private:
|
||||
const sc_core::sc_object *get_socket() const { return this; }
|
||||
|
||||
private:
|
||||
process m_process;
|
||||
};
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH = 32
|
||||
, typename TYPES = tlm::tlm_base_protocol_types >
|
||||
class passthrough_target_socket_tagged
|
||||
: public passthrough_target_socket_tagged_b<MODULE,BUSWIDTH,TYPES>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class passthrough_target_socket_tagged :
|
||||
public passthrough_target_socket_tagged_b<MODULE, BUSWIDTH, TYPES>
|
||||
{
|
||||
typedef passthrough_target_socket_tagged_b<MODULE,BUSWIDTH,TYPES> socket_b;
|
||||
public:
|
||||
passthrough_target_socket_tagged() : socket_b() {}
|
||||
explicit passthrough_target_socket_tagged(const char* name) : socket_b(name) {}
|
||||
typedef passthrough_target_socket_tagged_b<MODULE, BUSWIDTH, TYPES>
|
||||
socket_b;
|
||||
public:
|
||||
passthrough_target_socket_tagged() : socket_b() {}
|
||||
explicit passthrough_target_socket_tagged(const char *name) :
|
||||
socket_b(name)
|
||||
{}
|
||||
};
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH = 32
|
||||
, typename TYPES = tlm::tlm_base_protocol_types >
|
||||
class passthrough_target_socket_tagged_optional
|
||||
: public passthrough_target_socket_tagged_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class passthrough_target_socket_tagged_optional :
|
||||
public passthrough_target_socket_tagged_b<
|
||||
MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
{
|
||||
typedef passthrough_target_socket_tagged_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
passthrough_target_socket_tagged_optional() : socket_b() {}
|
||||
explicit passthrough_target_socket_tagged_optional(const char* name) : socket_b(name) {}
|
||||
typedef passthrough_target_socket_tagged_b<
|
||||
MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
passthrough_target_socket_tagged_optional() : socket_b() {}
|
||||
explicit passthrough_target_socket_tagged_optional(const char *name) :
|
||||
socket_b(name)
|
||||
{}
|
||||
};
|
||||
|
||||
} // namespace tlm_utils
|
||||
#endif // TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H_INCLUDED_
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_PASSTHROUGH_TARGET_SOCKET_H__ */
|
||||
|
||||
@@ -17,128 +17,107 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
// 12-Jan-2009 John Aynsley Bug fix. Phase argument to notify should be const
|
||||
// 20-Mar-2009 John Aynsley Add cancel_all() method
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_PEQ_WITH_CB_AND_PHASE_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_PEQ_WITH_CB_AND_PHASE_H__
|
||||
|
||||
|
||||
#ifndef __PEQ_WITH_CB_AND_PHASE_H__
|
||||
#define __PEQ_WITH_CB_AND_PHASE_H__
|
||||
|
||||
#ifndef SC_INCLUDE_DYNAMIC_PROCESSES // needed for sc_spawn
|
||||
# define SC_INCLUDE_DYNAMIC_PROCESSES
|
||||
#endif
|
||||
|
||||
#include <vector>
|
||||
#include <systemc>
|
||||
#include <tlm>
|
||||
#include <vector>
|
||||
|
||||
namespace tlm_utils {
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
template <typename PAYLOAD>
|
||||
class time_ordered_list
|
||||
{
|
||||
public:
|
||||
struct element
|
||||
{
|
||||
struct element *next;
|
||||
PAYLOAD p;
|
||||
sc_core::sc_time t;
|
||||
sc_dt::uint64 d;
|
||||
element(PAYLOAD& p, sc_core::sc_time t, sc_dt::uint64 d): p(p),t(t),d(d) {}
|
||||
element(){}
|
||||
};
|
||||
public:
|
||||
struct element
|
||||
{
|
||||
struct element *next;
|
||||
PAYLOAD p;
|
||||
sc_core::sc_time t;
|
||||
sc_dt::uint64 d;
|
||||
element(PAYLOAD &p, sc_core::sc_time t, sc_dt::uint64 d) :
|
||||
p(p), t(t), d(d)
|
||||
{}
|
||||
element() {}
|
||||
};
|
||||
|
||||
element *nill;
|
||||
element *empties;
|
||||
element *list;
|
||||
unsigned int size;
|
||||
element *nill;
|
||||
element *empties;
|
||||
element *list;
|
||||
unsigned int size;
|
||||
|
||||
time_ordered_list()
|
||||
: nill(new element()),
|
||||
empties(NULL),
|
||||
list(nill),
|
||||
size(0)
|
||||
{
|
||||
}
|
||||
time_ordered_list() : nill(new element()), empties(NULL),
|
||||
list(nill), size(0)
|
||||
{}
|
||||
|
||||
~time_ordered_list() {
|
||||
reset();
|
||||
while(empties){
|
||||
struct element *e=empties->next;
|
||||
delete empties;
|
||||
empties=e;
|
||||
}
|
||||
delete nill;
|
||||
}
|
||||
|
||||
void reset() {
|
||||
while(size) {
|
||||
delete_top();
|
||||
}
|
||||
}
|
||||
|
||||
void insert(const PAYLOAD& p, sc_core::sc_time t) {
|
||||
if (!empties) {
|
||||
empties=new struct element();
|
||||
empties->next=NULL;
|
||||
~time_ordered_list()
|
||||
{
|
||||
reset();
|
||||
while (empties) {
|
||||
struct element *e = empties->next;
|
||||
delete empties;
|
||||
empties = e;
|
||||
}
|
||||
delete nill;
|
||||
}
|
||||
|
||||
struct element *e=empties;
|
||||
empties=empties->next;
|
||||
e->p=p;
|
||||
e->t=t;
|
||||
e->d=sc_core::sc_delta_count();
|
||||
|
||||
struct element * ancestor=nill;
|
||||
struct element * iterator=list;
|
||||
while (iterator!=nill && iterator->t<=t){
|
||||
ancestor=iterator;
|
||||
iterator=iterator->next;
|
||||
void
|
||||
reset()
|
||||
{
|
||||
while (size) {
|
||||
delete_top();
|
||||
}
|
||||
}
|
||||
if (ancestor==nill){
|
||||
e->next=list;
|
||||
list=e;
|
||||
|
||||
void
|
||||
insert(const PAYLOAD &p, sc_core::sc_time t)
|
||||
{
|
||||
if (!empties) {
|
||||
empties = new struct element();
|
||||
empties->next=NULL;
|
||||
}
|
||||
|
||||
struct element *e = empties;
|
||||
empties = empties->next;
|
||||
e->p = p;
|
||||
e->t = t;
|
||||
e->d = sc_core::sc_delta_count();
|
||||
|
||||
struct element *ancestor = nill;
|
||||
struct element *iterator = list;
|
||||
while (iterator != nill && iterator->t <= t) {
|
||||
ancestor = iterator;
|
||||
iterator = iterator->next;
|
||||
}
|
||||
if (ancestor == nill) {
|
||||
e->next = list;
|
||||
list = e;
|
||||
} else {
|
||||
e->next = iterator;
|
||||
ancestor->next = e;
|
||||
}
|
||||
size++;
|
||||
}
|
||||
else {
|
||||
e->next=iterator;
|
||||
ancestor->next=e;
|
||||
|
||||
void
|
||||
delete_top()
|
||||
{
|
||||
if (list != nill) {
|
||||
struct element *e = list;
|
||||
list = list->next;
|
||||
e->next = empties;
|
||||
empties = e;
|
||||
size--;
|
||||
}
|
||||
}
|
||||
size++;
|
||||
}
|
||||
|
||||
void delete_top(){
|
||||
if (list != nill) {
|
||||
struct element *e=list;
|
||||
list=list->next;
|
||||
e->next=empties;
|
||||
empties=e;
|
||||
size--;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int get_size()
|
||||
{
|
||||
return size;
|
||||
}
|
||||
|
||||
PAYLOAD &top()
|
||||
{
|
||||
return list->p;
|
||||
}
|
||||
sc_core::sc_time top_time()
|
||||
{
|
||||
return list->t;
|
||||
}
|
||||
|
||||
sc_dt::uint64& top_delta()
|
||||
{
|
||||
return list->d;
|
||||
}
|
||||
|
||||
sc_core::sc_time next_time()
|
||||
{
|
||||
return list->next->t;
|
||||
}
|
||||
unsigned int get_size() { return size; }
|
||||
PAYLOAD &top() { return list->p; }
|
||||
sc_core::sc_time top_time() { return list->t; }
|
||||
sc_dt::uint64 &top_delta() { return list->d; }
|
||||
sc_core::sc_time next_time() { return list->next->t; }
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -147,155 +126,174 @@ public:
|
||||
* notifications. Each notification have an associate payload.
|
||||
*/
|
||||
//---------------------------------------------------------------------------
|
||||
template<typename OWNER,typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class peq_with_cb_and_phase:
|
||||
public sc_core::sc_object
|
||||
template<typename OWNER, typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class peq_with_cb_and_phase : public sc_core::sc_object
|
||||
{
|
||||
typedef typename TYPES::tlm_payload_type tlm_payload_type;
|
||||
typedef typename TYPES::tlm_phase_type tlm_phase_type;
|
||||
typedef std::pair<tlm_payload_type *, tlm_phase_type> PAYLOAD;
|
||||
typedef void (OWNER::*cb)(tlm_payload_type &, const tlm_phase_type &);
|
||||
|
||||
typedef typename TYPES::tlm_payload_type tlm_payload_type;
|
||||
typedef typename TYPES::tlm_phase_type tlm_phase_type;
|
||||
typedef std::pair<tlm_payload_type*, tlm_phase_type> PAYLOAD;
|
||||
typedef void (OWNER::*cb)(tlm_payload_type&, const tlm_phase_type&);
|
||||
class delta_list
|
||||
{
|
||||
public:
|
||||
delta_list()
|
||||
{
|
||||
reset();
|
||||
entries.resize(100);
|
||||
}
|
||||
|
||||
inline void
|
||||
insert(const PAYLOAD &p)
|
||||
{
|
||||
if (size==entries.size()) {
|
||||
entries.resize(entries.size() * 2);
|
||||
}
|
||||
entries[size++] = p;
|
||||
}
|
||||
|
||||
inline PAYLOAD &get() { return entries[out++]; }
|
||||
inline bool next() { return out < size; }
|
||||
inline void
|
||||
reset()
|
||||
{
|
||||
size=0;
|
||||
out=0;
|
||||
}
|
||||
|
||||
public:
|
||||
unsigned int size;
|
||||
|
||||
private:
|
||||
std::vector<PAYLOAD> entries;
|
||||
unsigned int out;
|
||||
};
|
||||
|
||||
class delta_list{
|
||||
public:
|
||||
delta_list(){
|
||||
reset();
|
||||
entries.resize(100);
|
||||
peq_with_cb_and_phase(OWNER *_owner, cb _cb) :
|
||||
sc_core::sc_object(sc_core::sc_gen_unique_name(
|
||||
"peq_with_cb_and_phase")),
|
||||
m_owner(_owner), m_cb(_cb)
|
||||
{
|
||||
sc_core::sc_spawn_options opts;
|
||||
opts.spawn_method();
|
||||
opts.set_sensitivity(&m_e);
|
||||
opts.dont_initialize();
|
||||
sc_core::sc_spawn(sc_bind(&peq_with_cb_and_phase::fec, this),
|
||||
sc_core::sc_gen_unique_name("fec"), &opts);
|
||||
}
|
||||
|
||||
inline void insert(const PAYLOAD& p){
|
||||
if (size==entries.size()){
|
||||
entries.resize(entries.size()*2);
|
||||
}
|
||||
entries[size++]=p;
|
||||
peq_with_cb_and_phase(const char *_name, OWNER *_owner, cb _cb) :
|
||||
sc_core::sc_object(_name), m_owner(_owner), m_cb(_cb)
|
||||
{
|
||||
sc_core::sc_spawn_options opts;
|
||||
opts.spawn_method();
|
||||
opts.set_sensitivity(&m_e);
|
||||
opts.dont_initialize();
|
||||
sc_core::sc_spawn(sc_bind(&peq_with_cb_and_phase::fec, this),
|
||||
sc_core::sc_gen_unique_name("fec"), &opts);
|
||||
}
|
||||
|
||||
inline PAYLOAD& get(){
|
||||
return entries[out++];
|
||||
~peq_with_cb_and_phase() {}
|
||||
|
||||
void
|
||||
notify(tlm_payload_type &t, const tlm_phase_type &p,
|
||||
const sc_core::sc_time &when)
|
||||
{
|
||||
if (when == sc_core::SC_ZERO_TIME) {
|
||||
if (sc_core::sc_delta_count() & (sc_dt::uint64)0x1) {
|
||||
// Uneven delta cycle so delta delay is for even cycle.
|
||||
m_even_delta.insert(PAYLOAD(&t,p));
|
||||
} else {
|
||||
// Even delta cycle so delta delay is for uneven delta.
|
||||
m_uneven_delta.insert(PAYLOAD(&t, p));
|
||||
}
|
||||
m_e.notify(sc_core::SC_ZERO_TIME);
|
||||
} else {
|
||||
m_ppq.insert(PAYLOAD(&t, p), when + sc_core::sc_time_stamp());
|
||||
// Note, this will only overwrite the "newest" event.
|
||||
m_e.notify(when);
|
||||
}
|
||||
}
|
||||
|
||||
inline bool next(){
|
||||
return out<size;
|
||||
void
|
||||
notify(tlm_payload_type &t, const tlm_phase_type &p)
|
||||
{
|
||||
m_immediate_yield.insert(PAYLOAD(&t, p));
|
||||
m_e.notify(); // Immediate notification.
|
||||
}
|
||||
|
||||
inline void reset(){
|
||||
size=0;
|
||||
out=0;
|
||||
// Cancel all events from the event queue.
|
||||
void
|
||||
cancel_all()
|
||||
{
|
||||
m_ppq.reset();
|
||||
m_uneven_delta.reset();
|
||||
m_even_delta.reset();
|
||||
m_immediate_yield.reset();
|
||||
m_e.cancel();
|
||||
}
|
||||
public:
|
||||
unsigned int size;
|
||||
|
||||
private:
|
||||
std::vector<PAYLOAD> entries;
|
||||
unsigned int out;
|
||||
};
|
||||
void
|
||||
fec()
|
||||
{
|
||||
// Immediate yield notifications.
|
||||
while (m_immediate_yield.next()) {
|
||||
PAYLOAD &tmp = m_immediate_yield.get();
|
||||
(m_owner->*m_cb)(*tmp.first, tmp.second);
|
||||
}
|
||||
m_immediate_yield.reset();
|
||||
|
||||
public:
|
||||
// Delta notifications.
|
||||
if (sc_core::sc_delta_count() & (sc_dt::uint64)0x1) {
|
||||
// Uneven delta so put out all payloads for uneven delta.
|
||||
while (m_uneven_delta.next()) {
|
||||
PAYLOAD &tmp = m_uneven_delta.get();
|
||||
(m_owner->*m_cb)(*tmp.first, tmp.second);
|
||||
}
|
||||
m_uneven_delta.reset();
|
||||
if (m_even_delta.size)
|
||||
m_e.notify(sc_core::SC_ZERO_TIME);
|
||||
} else {
|
||||
while (m_even_delta.next()) {
|
||||
PAYLOAD &tmp = m_even_delta.get();
|
||||
(m_owner->*m_cb)(*tmp.first, tmp.second);
|
||||
}
|
||||
m_even_delta.reset();
|
||||
if (m_uneven_delta.size)
|
||||
m_e.notify(sc_core::SC_ZERO_TIME);
|
||||
}
|
||||
if (!m_ppq.get_size())
|
||||
return; // There were only delta notification.
|
||||
|
||||
peq_with_cb_and_phase(OWNER* _owner, cb _cb)
|
||||
:sc_core::sc_object( sc_core::sc_gen_unique_name( "peq_with_cb_and_phase" ) )
|
||||
,m_owner(_owner)
|
||||
,m_cb(_cb)
|
||||
{
|
||||
sc_core::sc_spawn_options opts;
|
||||
opts.spawn_method();
|
||||
opts.set_sensitivity(&m_e);
|
||||
opts.dont_initialize();
|
||||
sc_core::sc_spawn(sc_bind(&peq_with_cb_and_phase::fec, this),
|
||||
sc_core::sc_gen_unique_name("fec"), &opts);
|
||||
}
|
||||
// Timed notifications.
|
||||
const sc_core::sc_time now = sc_core::sc_time_stamp();
|
||||
sc_core::sc_time top = m_ppq.top_time();
|
||||
|
||||
peq_with_cb_and_phase(const char* _name, OWNER* _owner,cb _cb)
|
||||
: sc_core::sc_object( _name )
|
||||
,m_owner(_owner)
|
||||
,m_cb(_cb)
|
||||
{
|
||||
sc_core::sc_spawn_options opts;
|
||||
opts.spawn_method();
|
||||
opts.set_sensitivity(&m_e);
|
||||
opts.dont_initialize();
|
||||
sc_core::sc_spawn(sc_bind(&peq_with_cb_and_phase::fec, this),
|
||||
sc_core::sc_gen_unique_name("fec"), &opts);
|
||||
}
|
||||
|
||||
~peq_with_cb_and_phase(){}
|
||||
|
||||
void notify (tlm_payload_type& t, const tlm_phase_type& p, const sc_core::sc_time& when){
|
||||
//t.aquire();
|
||||
if (when==sc_core::SC_ZERO_TIME) {
|
||||
if (sc_core::sc_delta_count() & (sc_dt::uint64)0x1) //uneven delta cycle so delta delay is for even cylce
|
||||
m_even_delta.insert(PAYLOAD(&t,p));
|
||||
else
|
||||
m_uneven_delta.insert(PAYLOAD(&t,p)); //even delta cycle so delta delay is for uneven delta
|
||||
m_e.notify(sc_core::SC_ZERO_TIME);
|
||||
}
|
||||
else {
|
||||
m_ppq.insert(PAYLOAD(&t,p), when + sc_core::sc_time_stamp() );
|
||||
m_e.notify(when); // note, this will only over-right the "newest" event.
|
||||
}
|
||||
}
|
||||
|
||||
void notify (tlm_payload_type& t, const tlm_phase_type& p){
|
||||
m_immediate_yield.insert(PAYLOAD(&t,p));
|
||||
m_e.notify(); // immediate notification
|
||||
}
|
||||
|
||||
// Cancel all events from the event queue
|
||||
void cancel_all() {
|
||||
m_ppq.reset();
|
||||
m_uneven_delta.reset();
|
||||
m_even_delta.reset();
|
||||
m_immediate_yield.reset();
|
||||
m_e.cancel();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
void fec(){
|
||||
//immediate yield notifications
|
||||
while(m_immediate_yield.next()) {PAYLOAD& tmp=m_immediate_yield.get(); (m_owner->*m_cb)(*tmp.first, tmp.second);} //tmp.first->release();}
|
||||
m_immediate_yield.reset();
|
||||
|
||||
//delta notifications
|
||||
if (sc_core::sc_delta_count() & (sc_dt::uint64) 0x1) {//uneven delta so put out all payloads for uneven delta
|
||||
while (m_uneven_delta.next()) {PAYLOAD& tmp=m_uneven_delta.get(); (m_owner->*m_cb)(*tmp.first, tmp.second);} //tmp.first->release();}
|
||||
m_uneven_delta.reset();
|
||||
if (m_even_delta.size) m_e.notify(sc_core::SC_ZERO_TIME);
|
||||
}
|
||||
else {
|
||||
while (m_even_delta.next()) {PAYLOAD& tmp=m_even_delta.get(); (m_owner->*m_cb)(*tmp.first, tmp.second);} //tmp.first->release();}
|
||||
m_even_delta.reset();
|
||||
if (m_uneven_delta.size) m_e.notify(sc_core::SC_ZERO_TIME);
|
||||
}
|
||||
if (!m_ppq.get_size()) return; //there were only delta notification
|
||||
|
||||
//timed notifications
|
||||
const sc_core::sc_time now=sc_core::sc_time_stamp();
|
||||
sc_core::sc_time top=m_ppq.top_time();
|
||||
|
||||
while(m_ppq.get_size() && top==now) { // push all active ones into target
|
||||
PAYLOAD& tmp=m_ppq.top();
|
||||
(m_owner->*m_cb)(*tmp.first, tmp.second); //tmp.first->release();}
|
||||
m_ppq.delete_top();
|
||||
top=m_ppq.top_time();
|
||||
}
|
||||
if ( m_ppq.get_size()) {
|
||||
m_e.notify( top - now) ;
|
||||
while (m_ppq.get_size() && top == now) {
|
||||
// Push all active ones into target.
|
||||
PAYLOAD &tmp = m_ppq.top();
|
||||
(m_owner->*m_cb)(*tmp.first, tmp.second);
|
||||
m_ppq.delete_top();
|
||||
top = m_ppq.top_time();
|
||||
}
|
||||
if (m_ppq.get_size()) {
|
||||
m_e.notify(top - now);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
OWNER *m_owner;
|
||||
cb m_cb;
|
||||
|
||||
OWNER* m_owner;
|
||||
cb m_cb;
|
||||
time_ordered_list<PAYLOAD> m_ppq;
|
||||
delta_list m_uneven_delta;
|
||||
delta_list m_even_delta;
|
||||
delta_list m_immediate_yield;
|
||||
|
||||
time_ordered_list<PAYLOAD> m_ppq;
|
||||
delta_list m_uneven_delta;
|
||||
delta_list m_even_delta;
|
||||
delta_list m_immediate_yield;
|
||||
|
||||
sc_core::sc_event m_e; // default event
|
||||
sc_core::sc_event m_e; // Default event.
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace tlm_utils
|
||||
|
||||
#endif // __PEQ_WITH_CB_AND_PHASE_H__
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_PEQ_WITH_CB_AND_PHASE_H__ */
|
||||
|
||||
@@ -21,74 +21,76 @@
|
||||
// 20-Mar-2009 John Aynsley Add cancel_all() method
|
||||
|
||||
|
||||
#ifndef __PEQ_WITH_GET_H__
|
||||
#define __PEQ_WITH_GET_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_PEQ_WITH_GET_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_PEQ_WITH_GET_H__
|
||||
|
||||
#include <systemc>
|
||||
//#include <tlm>
|
||||
#include <map>
|
||||
#include <systemc>
|
||||
|
||||
namespace tlm_utils {
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
template <class PAYLOAD>
|
||||
class peq_with_get : public sc_core::sc_object
|
||||
{
|
||||
public:
|
||||
typedef PAYLOAD transaction_type;
|
||||
typedef std::pair<const sc_core::sc_time, transaction_type*> pair_type;
|
||||
public:
|
||||
typedef PAYLOAD transaction_type;
|
||||
typedef std::pair<const sc_core::sc_time, transaction_type *> pair_type;
|
||||
|
||||
public:
|
||||
peq_with_get(const char* name) : sc_core::sc_object(name)
|
||||
{
|
||||
}
|
||||
public:
|
||||
peq_with_get(const char *name) : sc_core::sc_object(name) {}
|
||||
|
||||
void notify(transaction_type& trans, const sc_core::sc_time& t)
|
||||
{
|
||||
m_scheduled_events.insert(pair_type(t + sc_core::sc_time_stamp(), &trans));
|
||||
m_event.notify(t);
|
||||
}
|
||||
|
||||
void notify(transaction_type& trans)
|
||||
{
|
||||
m_scheduled_events.insert(pair_type(sc_core::sc_time_stamp(), &trans));
|
||||
m_event.notify(); // immediate notification
|
||||
}
|
||||
|
||||
// needs to be called until it returns 0
|
||||
transaction_type* get_next_transaction()
|
||||
{
|
||||
if (m_scheduled_events.empty()) {
|
||||
return 0;
|
||||
void
|
||||
notify(transaction_type &trans, const sc_core::sc_time &t)
|
||||
{
|
||||
m_scheduled_events.insert(pair_type(t + sc_core::sc_time_stamp(),
|
||||
&trans));
|
||||
m_event.notify(t);
|
||||
}
|
||||
|
||||
sc_core::sc_time now = sc_core::sc_time_stamp();
|
||||
if (m_scheduled_events.begin()->first <= now) {
|
||||
transaction_type* trans = m_scheduled_events.begin()->second;
|
||||
m_scheduled_events.erase(m_scheduled_events.begin());
|
||||
return trans;
|
||||
void
|
||||
notify(transaction_type &trans)
|
||||
{
|
||||
m_scheduled_events.insert(pair_type(sc_core::sc_time_stamp(), &trans));
|
||||
m_event.notify(); // Immediate notification.
|
||||
}
|
||||
|
||||
m_event.notify(m_scheduled_events.begin()->first - now);
|
||||
// Needs to be called until it returns NULL
|
||||
transaction_type *
|
||||
get_next_transaction()
|
||||
{
|
||||
if (m_scheduled_events.empty()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
sc_core::sc_time now = sc_core::sc_time_stamp();
|
||||
if (m_scheduled_events.begin()->first <= now) {
|
||||
transaction_type *trans = m_scheduled_events.begin()->second;
|
||||
m_scheduled_events.erase(m_scheduled_events.begin());
|
||||
return trans;
|
||||
}
|
||||
|
||||
sc_core::sc_event& get_event()
|
||||
{
|
||||
return m_event;
|
||||
}
|
||||
m_event.notify(m_scheduled_events.begin()->first - now);
|
||||
|
||||
// Cancel all events from the event queue
|
||||
void cancel_all() {
|
||||
m_scheduled_events.clear();
|
||||
m_event.cancel();
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
private:
|
||||
std::multimap<const sc_core::sc_time, transaction_type*> m_scheduled_events;
|
||||
sc_core::sc_event m_event;
|
||||
sc_core::sc_event &get_event() { return m_event; }
|
||||
|
||||
// Cancel all events from the event queue.
|
||||
void
|
||||
cancel_all()
|
||||
{
|
||||
m_scheduled_events.clear();
|
||||
m_event.cancel();
|
||||
}
|
||||
|
||||
private:
|
||||
std::multimap<const sc_core::sc_time, transaction_type *>
|
||||
m_scheduled_events;
|
||||
sc_core::sc_event m_event;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace tlm_utils
|
||||
|
||||
#endif
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_PEQ_WITH_GET_H__ */
|
||||
|
||||
@@ -17,300 +17,327 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H_INCLUDED_
|
||||
#define TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H_INCLUDED_
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H__
|
||||
|
||||
#include <tlm>
|
||||
|
||||
#include "tlm_utils/convenience_socket_bases.h"
|
||||
|
||||
namespace tlm_utils {
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH, typename TYPES
|
||||
, sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND >
|
||||
class simple_initiator_socket_b
|
||||
: public tlm::tlm_initiator_socket<BUSWIDTH, TYPES, 1, POL>
|
||||
, protected simple_socket_base
|
||||
namespace tlm_utils
|
||||
{
|
||||
public:
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
|
||||
typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
|
||||
typedef tlm::tlm_initiator_socket<BUSWIDTH,TYPES,1,POL> base_type;
|
||||
|
||||
public:
|
||||
static const char* default_name()
|
||||
{ return sc_core::sc_gen_unique_name("simple_initiator_socket"); }
|
||||
|
||||
explicit simple_initiator_socket_b(const char* n = default_name())
|
||||
: base_type(n)
|
||||
, m_process(this)
|
||||
{
|
||||
this->m_export.bind(m_process);
|
||||
}
|
||||
|
||||
void register_nb_transport_bw(MODULE* mod,
|
||||
sync_enum_type (MODULE::*cb)(transaction_type&,
|
||||
phase_type&,
|
||||
sc_core::sc_time&))
|
||||
{
|
||||
m_process.set_transport_ptr(mod, cb);
|
||||
}
|
||||
|
||||
void register_invalidate_direct_mem_ptr(MODULE* mod,
|
||||
void (MODULE::*cb)(sc_dt::uint64, sc_dt::uint64))
|
||||
{
|
||||
m_process.set_invalidate_direct_mem_ptr(mod, cb);
|
||||
}
|
||||
|
||||
private:
|
||||
class process
|
||||
: public tlm::tlm_bw_transport_if<TYPES>
|
||||
, protected convenience_socket_cb_holder
|
||||
{
|
||||
template <typename MODULE, unsigned int BUSWIDTH, typename TYPES,
|
||||
sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class simple_initiator_socket_b :
|
||||
public tlm::tlm_initiator_socket<BUSWIDTH, TYPES, 1, POL>,
|
||||
protected simple_socket_base
|
||||
{
|
||||
public:
|
||||
typedef sync_enum_type (MODULE::*TransportPtr)(transaction_type&,
|
||||
phase_type&,
|
||||
sc_core::sc_time&);
|
||||
typedef void (MODULE::*InvalidateDirectMemPtr)(sc_dt::uint64,
|
||||
sc_dt::uint64);
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
|
||||
typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
|
||||
typedef tlm::tlm_initiator_socket<BUSWIDTH, TYPES, 1, POL> base_type;
|
||||
|
||||
explicit process(simple_socket_base* owner)
|
||||
: convenience_socket_cb_holder(owner), m_mod(0)
|
||||
, m_transport_ptr(0)
|
||||
, m_invalidate_direct_mem_ptr(0)
|
||||
public:
|
||||
static const char *
|
||||
default_name()
|
||||
{
|
||||
return sc_core::sc_gen_unique_name("simple_initiator_socket");
|
||||
}
|
||||
|
||||
void set_transport_ptr(MODULE* mod, TransportPtr p)
|
||||
explicit simple_initiator_socket_b(const char *n=default_name()) :
|
||||
base_type(n), m_process(this)
|
||||
{
|
||||
if (m_transport_ptr) {
|
||||
display_warning("non-blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_transport_ptr = p;
|
||||
this->m_export.bind(m_process);
|
||||
}
|
||||
|
||||
void set_invalidate_direct_mem_ptr(MODULE* mod, InvalidateDirectMemPtr p)
|
||||
void
|
||||
register_nb_transport_bw(MODULE *mod,
|
||||
sync_enum_type (MODULE::*cb)(transaction_type &, phase_type &,
|
||||
sc_core::sc_time &))
|
||||
{
|
||||
if (m_invalidate_direct_mem_ptr) {
|
||||
display_warning("invalidate DMI callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_invalidate_direct_mem_ptr = p;
|
||||
m_process.set_transport_ptr(mod, cb);
|
||||
}
|
||||
|
||||
sync_enum_type nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
|
||||
void
|
||||
register_invalidate_direct_mem_ptr(MODULE *mod,
|
||||
void (MODULE::*cb)(sc_dt::uint64, sc_dt::uint64))
|
||||
{
|
||||
if (m_transport_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_transport_ptr)(trans, phase, t);
|
||||
}
|
||||
display_error("no transport callback registered");
|
||||
return tlm::TLM_COMPLETED;
|
||||
}
|
||||
|
||||
void invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
|
||||
sc_dt::uint64 end_range)
|
||||
{
|
||||
if (m_invalidate_direct_mem_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
(m_mod->*m_invalidate_direct_mem_ptr)(start_range, end_range);
|
||||
}
|
||||
m_process.set_invalidate_direct_mem_ptr(mod, cb);
|
||||
}
|
||||
|
||||
private:
|
||||
MODULE* m_mod;
|
||||
TransportPtr m_transport_ptr;
|
||||
InvalidateDirectMemPtr m_invalidate_direct_mem_ptr;
|
||||
};
|
||||
class process : public tlm::tlm_bw_transport_if<TYPES>,
|
||||
protected convenience_socket_cb_holder
|
||||
{
|
||||
public:
|
||||
typedef sync_enum_type (MODULE::*TransportPtr)(
|
||||
transaction_type &, phase_type &, sc_core::sc_time &);
|
||||
typedef void (MODULE::*InvalidateDirectMemPtr)(
|
||||
sc_dt::uint64, sc_dt::uint64);
|
||||
|
||||
private:
|
||||
const sc_core::sc_object* get_socket() const { return this; }
|
||||
private:
|
||||
process m_process;
|
||||
explicit process(simple_socket_base *owner) :
|
||||
convenience_socket_cb_holder(owner), m_mod(0),
|
||||
m_transport_ptr(0), m_invalidate_direct_mem_ptr(0)
|
||||
{}
|
||||
|
||||
void
|
||||
set_transport_ptr(MODULE *mod, TransportPtr p)
|
||||
{
|
||||
if (m_transport_ptr) {
|
||||
display_warning("non-blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_transport_ptr = p;
|
||||
}
|
||||
|
||||
void
|
||||
set_invalidate_direct_mem_ptr(MODULE *mod, InvalidateDirectMemPtr p)
|
||||
{
|
||||
if (m_invalidate_direct_mem_ptr) {
|
||||
display_warning("invalidate DMI callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_invalidate_direct_mem_ptr = p;
|
||||
}
|
||||
|
||||
sync_enum_type
|
||||
nb_transport_bw(transaction_type &trans, phase_type &phase,
|
||||
sc_core::sc_time &t)
|
||||
{
|
||||
if (m_transport_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_transport_ptr)(trans, phase, t);
|
||||
}
|
||||
display_error("no transport callback registered");
|
||||
return tlm::TLM_COMPLETED;
|
||||
}
|
||||
|
||||
void
|
||||
invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
|
||||
sc_dt::uint64 end_range)
|
||||
{
|
||||
if (m_invalidate_direct_mem_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
(m_mod->*m_invalidate_direct_mem_ptr)(
|
||||
start_range, end_range);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
MODULE *m_mod;
|
||||
TransportPtr m_transport_ptr;
|
||||
InvalidateDirectMemPtr m_invalidate_direct_mem_ptr;
|
||||
};
|
||||
|
||||
private:
|
||||
const sc_core::sc_object *get_socket() const { return this; }
|
||||
|
||||
private:
|
||||
process m_process;
|
||||
};
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH = 32
|
||||
, typename TYPES = tlm::tlm_base_protocol_types >
|
||||
class simple_initiator_socket
|
||||
: public simple_initiator_socket_b<MODULE,BUSWIDTH,TYPES>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class simple_initiator_socket :
|
||||
public simple_initiator_socket_b<MODULE, BUSWIDTH, TYPES>
|
||||
{
|
||||
typedef simple_initiator_socket_b<MODULE,BUSWIDTH,TYPES> socket_b;
|
||||
public:
|
||||
simple_initiator_socket() : socket_b() {}
|
||||
explicit simple_initiator_socket(const char* name) : socket_b(name) {}
|
||||
typedef simple_initiator_socket_b<MODULE, BUSWIDTH, TYPES> socket_b;
|
||||
public:
|
||||
simple_initiator_socket() : socket_b() {}
|
||||
explicit simple_initiator_socket(const char *name) : socket_b(name) {}
|
||||
};
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH = 32
|
||||
, typename TYPES = tlm::tlm_base_protocol_types >
|
||||
class simple_initiator_socket_optional
|
||||
: public simple_initiator_socket_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class simple_initiator_socket_optional :
|
||||
public simple_initiator_socket_b<MODULE, BUSWIDTH, TYPES,
|
||||
sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
{
|
||||
typedef simple_initiator_socket_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
simple_initiator_socket_optional() : socket_b() {}
|
||||
explicit simple_initiator_socket_optional(const char* name) : socket_b(name) {}
|
||||
typedef simple_initiator_socket_b<
|
||||
MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
simple_initiator_socket_optional() : socket_b() {}
|
||||
explicit simple_initiator_socket_optional(const char *name) :
|
||||
socket_b(name)
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
// Tagged version
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH, typename TYPES
|
||||
, sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND >
|
||||
class simple_initiator_socket_tagged_b
|
||||
: public tlm::tlm_initiator_socket<BUSWIDTH, TYPES, 1, POL>
|
||||
, protected simple_socket_base
|
||||
template <typename MODULE, unsigned int BUSWIDTH, typename TYPES,
|
||||
sc_core::sc_port_policy POL=sc_core::SC_ONE_OR_MORE_BOUND>
|
||||
class simple_initiator_socket_tagged_b :
|
||||
public tlm::tlm_initiator_socket<BUSWIDTH, TYPES, 1, POL>,
|
||||
protected simple_socket_base
|
||||
{
|
||||
public:
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
|
||||
typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
|
||||
typedef tlm::tlm_initiator_socket<BUSWIDTH,TYPES,1,POL> base_type;
|
||||
|
||||
public:
|
||||
static const char* default_name()
|
||||
{ return sc_core::sc_gen_unique_name("simple_initiator_socket_tagged"); }
|
||||
|
||||
explicit simple_initiator_socket_tagged_b(const char* n = default_name())
|
||||
: base_type(n)
|
||||
, m_process(this)
|
||||
{
|
||||
this->m_export.bind(m_process);
|
||||
}
|
||||
|
||||
void register_nb_transport_bw(MODULE* mod,
|
||||
sync_enum_type (MODULE::*cb)(int,
|
||||
transaction_type&,
|
||||
phase_type&,
|
||||
sc_core::sc_time&),
|
||||
int id)
|
||||
{
|
||||
m_process.set_transport_ptr(mod, cb);
|
||||
m_process.set_transport_user_id(id);
|
||||
}
|
||||
|
||||
void register_invalidate_direct_mem_ptr(MODULE* mod,
|
||||
void (MODULE::*cb)(int, sc_dt::uint64, sc_dt::uint64),
|
||||
int id)
|
||||
{
|
||||
m_process.set_invalidate_direct_mem_ptr(mod, cb);
|
||||
m_process.set_invalidate_dmi_user_id(id);
|
||||
}
|
||||
|
||||
private:
|
||||
class process
|
||||
: public tlm::tlm_bw_transport_if<TYPES>
|
||||
, protected convenience_socket_cb_holder
|
||||
{
|
||||
public:
|
||||
typedef sync_enum_type (MODULE::*TransportPtr)(int,
|
||||
transaction_type&,
|
||||
phase_type&,
|
||||
sc_core::sc_time&);
|
||||
typedef void (MODULE::*InvalidateDirectMemPtr)(int,
|
||||
sc_dt::uint64,
|
||||
sc_dt::uint64);
|
||||
typedef typename TYPES::tlm_payload_type transaction_type;
|
||||
typedef typename TYPES::tlm_phase_type phase_type;
|
||||
typedef tlm::tlm_sync_enum sync_enum_type;
|
||||
typedef tlm::tlm_fw_transport_if<TYPES> fw_interface_type;
|
||||
typedef tlm::tlm_bw_transport_if<TYPES> bw_interface_type;
|
||||
typedef tlm::tlm_initiator_socket<BUSWIDTH, TYPES, 1, POL> base_type;
|
||||
|
||||
explicit process(simple_socket_base* owner)
|
||||
: convenience_socket_cb_holder(owner), m_mod(0)
|
||||
, m_transport_ptr(0)
|
||||
, m_invalidate_direct_mem_ptr(0)
|
||||
, m_transport_user_id(0)
|
||||
, m_invalidate_direct_mem_user_id(0)
|
||||
public:
|
||||
static const char *
|
||||
default_name()
|
||||
{
|
||||
return sc_core::sc_gen_unique_name("simple_initiator_socket_tagged");
|
||||
}
|
||||
|
||||
void set_transport_user_id(int id) { m_transport_user_id = id; }
|
||||
void set_invalidate_dmi_user_id(int id) { m_invalidate_direct_mem_user_id = id; }
|
||||
|
||||
void set_transport_ptr(MODULE* mod, TransportPtr p)
|
||||
explicit simple_initiator_socket_tagged_b(const char *n=default_name()) :
|
||||
base_type(n), m_process(this)
|
||||
{
|
||||
if (m_transport_ptr) {
|
||||
display_warning("non-blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_transport_ptr = p;
|
||||
this->m_export.bind(m_process);
|
||||
}
|
||||
|
||||
void set_invalidate_direct_mem_ptr(MODULE* mod, InvalidateDirectMemPtr p)
|
||||
void
|
||||
register_nb_transport_bw(MODULE *mod,
|
||||
sync_enum_type (MODULE::*cb)(
|
||||
int, transaction_type &, phase_type &, sc_core::sc_time &),
|
||||
int id)
|
||||
{
|
||||
if (m_invalidate_direct_mem_ptr) {
|
||||
display_warning("invalidate DMI callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_invalidate_direct_mem_ptr = p;
|
||||
m_process.set_transport_ptr(mod, cb);
|
||||
m_process.set_transport_user_id(id);
|
||||
}
|
||||
|
||||
sync_enum_type nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
|
||||
void
|
||||
register_invalidate_direct_mem_ptr(MODULE *mod,
|
||||
void (MODULE::*cb)(int, sc_dt::uint64, sc_dt::uint64), int id)
|
||||
{
|
||||
if (m_transport_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_transport_ptr)(m_transport_user_id, trans, phase, t);
|
||||
}
|
||||
display_error("no transport callback registered");
|
||||
return tlm::TLM_COMPLETED;
|
||||
}
|
||||
|
||||
void invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
|
||||
sc_dt::uint64 end_range)
|
||||
{
|
||||
if (m_invalidate_direct_mem_ptr) {
|
||||
// forward call
|
||||
sc_assert(m_mod);
|
||||
(m_mod->*m_invalidate_direct_mem_ptr)(m_invalidate_direct_mem_user_id, start_range, end_range);
|
||||
}
|
||||
m_process.set_invalidate_direct_mem_ptr(mod, cb);
|
||||
m_process.set_invalidate_dmi_user_id(id);
|
||||
}
|
||||
|
||||
private:
|
||||
MODULE* m_mod;
|
||||
TransportPtr m_transport_ptr;
|
||||
InvalidateDirectMemPtr m_invalidate_direct_mem_ptr;
|
||||
int m_transport_user_id;
|
||||
int m_invalidate_direct_mem_user_id;
|
||||
};
|
||||
class process : public tlm::tlm_bw_transport_if<TYPES>,
|
||||
protected convenience_socket_cb_holder
|
||||
{
|
||||
public:
|
||||
typedef sync_enum_type (MODULE::*TransportPtr)(
|
||||
int, transaction_type &, phase_type &, sc_core::sc_time &);
|
||||
typedef void (MODULE::*InvalidateDirectMemPtr)(
|
||||
int, sc_dt::uint64, sc_dt::uint64);
|
||||
|
||||
private:
|
||||
const sc_core::sc_object* get_socket() const { return this; }
|
||||
private:
|
||||
process m_process;
|
||||
explicit process(simple_socket_base *owner) :
|
||||
convenience_socket_cb_holder(owner), m_mod(0),
|
||||
m_transport_ptr(0), m_invalidate_direct_mem_ptr(0),
|
||||
m_transport_user_id(0), m_invalidate_direct_mem_user_id(0)
|
||||
{}
|
||||
|
||||
void set_transport_user_id(int id) { m_transport_user_id = id; }
|
||||
void
|
||||
set_invalidate_dmi_user_id(int id)
|
||||
{
|
||||
m_invalidate_direct_mem_user_id = id;
|
||||
}
|
||||
|
||||
void
|
||||
set_transport_ptr(MODULE *mod, TransportPtr p)
|
||||
{
|
||||
if (m_transport_ptr) {
|
||||
display_warning("non-blocking callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_transport_ptr = p;
|
||||
}
|
||||
|
||||
void
|
||||
set_invalidate_direct_mem_ptr(MODULE *mod, InvalidateDirectMemPtr p)
|
||||
{
|
||||
if (m_invalidate_direct_mem_ptr) {
|
||||
display_warning("invalidate DMI callback already registered");
|
||||
return;
|
||||
}
|
||||
sc_assert(!m_mod || m_mod == mod);
|
||||
m_mod = mod;
|
||||
m_invalidate_direct_mem_ptr = p;
|
||||
}
|
||||
|
||||
sync_enum_type
|
||||
nb_transport_bw(transaction_type &trans, phase_type &phase,
|
||||
sc_core::sc_time &t)
|
||||
{
|
||||
if (m_transport_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
return (m_mod->*m_transport_ptr)(
|
||||
m_transport_user_id, trans, phase, t);
|
||||
}
|
||||
display_error("no transport callback registered");
|
||||
return tlm::TLM_COMPLETED;
|
||||
}
|
||||
|
||||
void
|
||||
invalidate_direct_mem_ptr(
|
||||
sc_dt::uint64 start_range, sc_dt::uint64 end_range)
|
||||
{
|
||||
if (m_invalidate_direct_mem_ptr) {
|
||||
// Forward call.
|
||||
sc_assert(m_mod);
|
||||
(m_mod->*m_invalidate_direct_mem_ptr)(
|
||||
m_invalidate_direct_mem_user_id,
|
||||
start_range, end_range);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
MODULE *m_mod;
|
||||
TransportPtr m_transport_ptr;
|
||||
InvalidateDirectMemPtr m_invalidate_direct_mem_ptr;
|
||||
int m_transport_user_id;
|
||||
int m_invalidate_direct_mem_user_id;
|
||||
};
|
||||
|
||||
private:
|
||||
const sc_core::sc_object *get_socket() const { return this; }
|
||||
|
||||
private:
|
||||
process m_process;
|
||||
};
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH = 32
|
||||
, typename TYPES = tlm::tlm_base_protocol_types >
|
||||
class simple_initiator_socket_tagged
|
||||
: public simple_initiator_socket_tagged_b<MODULE,BUSWIDTH,TYPES>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class simple_initiator_socket_tagged :
|
||||
public simple_initiator_socket_tagged_b<MODULE, BUSWIDTH, TYPES>
|
||||
{
|
||||
typedef simple_initiator_socket_tagged_b<MODULE,BUSWIDTH,TYPES> socket_b;
|
||||
public:
|
||||
simple_initiator_socket_tagged() : socket_b() {}
|
||||
explicit simple_initiator_socket_tagged(const char* name) : socket_b(name) {}
|
||||
typedef simple_initiator_socket_tagged_b<
|
||||
MODULE, BUSWIDTH, TYPES> socket_b;
|
||||
public:
|
||||
simple_initiator_socket_tagged() : socket_b() {}
|
||||
explicit simple_initiator_socket_tagged(const char *name) :
|
||||
socket_b(name)
|
||||
{}
|
||||
};
|
||||
|
||||
template< typename MODULE, unsigned int BUSWIDTH = 32
|
||||
, typename TYPES = tlm::tlm_base_protocol_types >
|
||||
class simple_initiator_socket_tagged_optional
|
||||
: public simple_initiator_socket_tagged_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
template <typename MODULE, unsigned int BUSWIDTH=32,
|
||||
typename TYPES=tlm::tlm_base_protocol_types>
|
||||
class simple_initiator_socket_tagged_optional :
|
||||
public simple_initiator_socket_tagged_b<MODULE, BUSWIDTH, TYPES,
|
||||
sc_core::SC_ZERO_OR_MORE_BOUND>
|
||||
{
|
||||
typedef simple_initiator_socket_tagged_b<MODULE,BUSWIDTH,TYPES,sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
simple_initiator_socket_tagged_optional() : socket_b() {}
|
||||
explicit simple_initiator_socket_tagged_optional(const char* name) : socket_b(name) {}
|
||||
typedef simple_initiator_socket_tagged_b<
|
||||
MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND> socket_b;
|
||||
public:
|
||||
simple_initiator_socket_tagged_optional() : socket_b() {}
|
||||
explicit simple_initiator_socket_tagged_optional(const char *name) :
|
||||
socket_b(name)
|
||||
{}
|
||||
};
|
||||
|
||||
} // namespace tlm_utils
|
||||
#endif // TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H_INCLUDED_
|
||||
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_SIMPLE_INITIATOR_SOCKET_H__ */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -17,138 +17,118 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
// 20-Mar-2009 John Aynsley Add set_and_sync() method
|
||||
|
||||
|
||||
#ifndef __TLM_QUANTUMKEEPER_H__
|
||||
#define __TLM_QUANTUMKEEPER_H__
|
||||
#ifndef __SYSTEMC_EXT_TLM_UTILS_TLM_QUANTUMKEEPER_H__
|
||||
#define __SYSTEMC_EXT_TLM_UTILS_TLM_QUANTUMKEEPER_H__
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_quantum/tlm_global_quantum.h"
|
||||
|
||||
namespace tlm_utils {
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
//
|
||||
// tlm_quantumkeeper class
|
||||
//
|
||||
// The tlm_quantumkeeper class is used to keep track of the local time in
|
||||
// an initiator (how much it has run ahead of the SystemC time), to
|
||||
// synchronize with SystemC time etc.
|
||||
//
|
||||
class tlm_quantumkeeper
|
||||
{
|
||||
// tlm_quantumkeeper class
|
||||
//
|
||||
// The tlm_quantumkeeper class is used to keep track of the local time in
|
||||
// an initiator (how much it has run ahead of the SystemC time), to
|
||||
// synchronize with SystemC time etc.
|
||||
class tlm_quantumkeeper
|
||||
{
|
||||
public:
|
||||
//
|
||||
// Static setters/getters for the global quantum value.
|
||||
//
|
||||
// The global quantum is the maximum time an initiator can run ahead of
|
||||
// systemC time. All initiators will synchronize on timingpoints that are
|
||||
// SystemC time. All initiators will synchronize on timing points that are
|
||||
// multiples of the global quantum value.
|
||||
//
|
||||
static void set_global_quantum(const sc_core::sc_time& t)
|
||||
static void
|
||||
set_global_quantum(const sc_core::sc_time &t)
|
||||
{
|
||||
tlm::tlm_global_quantum::instance().set(t);
|
||||
tlm::tlm_global_quantum::instance().set(t);
|
||||
}
|
||||
|
||||
static const sc_core::sc_time& get_global_quantum()
|
||||
static const sc_core::sc_time &
|
||||
get_global_quantum()
|
||||
{
|
||||
return tlm::tlm_global_quantum::instance().get();
|
||||
return tlm::tlm_global_quantum::instance().get();
|
||||
}
|
||||
|
||||
public:
|
||||
tlm_quantumkeeper() :
|
||||
m_next_sync_point(sc_core::SC_ZERO_TIME),
|
||||
m_local_time(sc_core::SC_ZERO_TIME)
|
||||
{
|
||||
}
|
||||
tlm_quantumkeeper() : m_next_sync_point(sc_core::SC_ZERO_TIME),
|
||||
m_local_time(sc_core::SC_ZERO_TIME)
|
||||
{}
|
||||
|
||||
virtual ~tlm_quantumkeeper() {}
|
||||
|
||||
//
|
||||
// Increment the local time (the time the initiator is ahead of the
|
||||
// systemC time) After incrementing the local time an initiator should
|
||||
// check (with the need_sync method) if a sync is required.
|
||||
//
|
||||
virtual void inc(const sc_core::sc_time& t)
|
||||
{
|
||||
m_local_time += t;
|
||||
}
|
||||
virtual void inc(const sc_core::sc_time &t) { m_local_time += t; }
|
||||
|
||||
//
|
||||
// Sets the local time (the time the initiator is ahead of the
|
||||
// systemC time) After changing the local time an initiator should
|
||||
// check (with the need_sync method) if a sync is required.
|
||||
//
|
||||
virtual void set(const sc_core::sc_time& t)
|
||||
{
|
||||
m_local_time = t;
|
||||
}
|
||||
virtual void set(const sc_core::sc_time &t) { m_local_time = t; }
|
||||
|
||||
//
|
||||
// Checks if a sync to systemC is required for this initiator. This will
|
||||
// be the case if the local time becomes greater than the local (current)
|
||||
// quantum value for this initiator.
|
||||
//
|
||||
virtual bool need_sync() const
|
||||
virtual bool
|
||||
need_sync() const
|
||||
{
|
||||
return sc_core::sc_time_stamp() + m_local_time >= m_next_sync_point;
|
||||
return sc_core::sc_time_stamp() + m_local_time >= m_next_sync_point;
|
||||
}
|
||||
|
||||
//
|
||||
// Synchronize to systemC. This call will do a wait for the time the
|
||||
// initiator was running ahead of systemC time and reset the
|
||||
// tlm_quantumkeeper.
|
||||
//
|
||||
virtual void sync()
|
||||
virtual void
|
||||
sync()
|
||||
{
|
||||
sc_core::wait(m_local_time);
|
||||
reset();
|
||||
sc_core::wait(m_local_time);
|
||||
reset();
|
||||
}
|
||||
|
||||
//
|
||||
// Non-virtual convenience method to set the local time and sync only if needed
|
||||
//
|
||||
void set_and_sync(const sc_core::sc_time& t)
|
||||
// Non-virtual convenience method to set the local time and sync only if
|
||||
// needed
|
||||
void
|
||||
set_and_sync(const sc_core::sc_time &t)
|
||||
{
|
||||
set(t);
|
||||
if (need_sync())
|
||||
sync();
|
||||
set(t);
|
||||
if (need_sync())
|
||||
sync();
|
||||
}
|
||||
|
||||
//
|
||||
// Resets the local time to SC_ZERO_TIME and computes the value of the
|
||||
// next local quantum. This method should be called by an initiator after
|
||||
// a wait because of a synchronization request by a target (TLM_ACCEPTED,
|
||||
// or TLM_UPDATED).
|
||||
//
|
||||
virtual void reset()
|
||||
virtual void
|
||||
reset()
|
||||
{
|
||||
m_local_time = sc_core::SC_ZERO_TIME;
|
||||
m_next_sync_point = sc_core::sc_time_stamp() + compute_local_quantum();
|
||||
m_local_time = sc_core::SC_ZERO_TIME;
|
||||
m_next_sync_point = sc_core::sc_time_stamp() + compute_local_quantum();
|
||||
}
|
||||
|
||||
//
|
||||
// Helper function to get the current systemC time, taken the local time
|
||||
// into account. The current systemC time is calculated as the time
|
||||
// returned by sc_time_stamp incremeneted with the time the initiator is
|
||||
// running ahead.
|
||||
//
|
||||
virtual sc_core::sc_time get_current_time() const
|
||||
virtual sc_core::sc_time
|
||||
get_current_time() const
|
||||
{
|
||||
return sc_core::sc_time_stamp() + m_local_time;
|
||||
return sc_core::sc_time_stamp() + m_local_time;
|
||||
}
|
||||
|
||||
//
|
||||
// Helper functions to get the time the initiator is running ahead of
|
||||
// systenC (local time). This time should be passed to a target in the
|
||||
// nb_transport call
|
||||
//
|
||||
virtual sc_core::sc_time get_local_time() const
|
||||
virtual sc_core::sc_time
|
||||
get_local_time() const
|
||||
{
|
||||
return m_local_time;
|
||||
return m_local_time;
|
||||
}
|
||||
|
||||
protected:
|
||||
//
|
||||
// Calculate the next local quantum for this initiator.
|
||||
//
|
||||
// The method can be overloaded in a derived object if an initiator wants
|
||||
@@ -156,17 +136,17 @@ namespace tlm_utils {
|
||||
// global quantum into account. It's local quantum should not be set to a
|
||||
// value that is larger than the quantum returned by the
|
||||
// compute_local_quantum of the tlm_global_quantum singleton.
|
||||
//
|
||||
virtual sc_core::sc_time compute_local_quantum()
|
||||
virtual sc_core::sc_time
|
||||
compute_local_quantum()
|
||||
{
|
||||
return tlm::tlm_global_quantum::instance().compute_local_quantum();
|
||||
return tlm::tlm_global_quantum::instance().compute_local_quantum();
|
||||
}
|
||||
|
||||
protected:
|
||||
sc_core::sc_time m_next_sync_point;
|
||||
sc_core::sc_time m_local_time;
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace tlm
|
||||
} // namespace tlm_utils
|
||||
|
||||
#endif
|
||||
#endif /* __SYSTEMC_EXT_TLM_UTILS_TLM_QUANTUMKEEPER_H__ */
|
||||
|
||||
@@ -17,68 +17,79 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_gp.h"
|
||||
#include "sysc/utils/sc_typeindex.h" // sc_typeindex
|
||||
|
||||
#include <map>
|
||||
#include <cstring> // std::memcpy et.al.
|
||||
#include <map>
|
||||
#include <systemc>
|
||||
#include <tlm>
|
||||
|
||||
using sc_core::sc_type_index;
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
template class SC_API tlm_array<tlm_extension_base*>;
|
||||
template class tlm_array<tlm_extension_base *>;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Classes for the extension mechanism
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
/* anonymous */ namespace {
|
||||
namespace
|
||||
{
|
||||
|
||||
class tlm_extension_registry
|
||||
{
|
||||
typedef unsigned int key_type;
|
||||
typedef std::map<sc_core::sc_type_index, key_type> type_map;
|
||||
public:
|
||||
static tlm_extension_registry& instance()
|
||||
public:
|
||||
static tlm_extension_registry &
|
||||
instance()
|
||||
{
|
||||
if (!instance_) // don't cleanup registry
|
||||
if (!instance_) {
|
||||
// Don't cleanup registry.
|
||||
instance_ = new tlm_extension_registry();
|
||||
}
|
||||
return *instance_;
|
||||
}
|
||||
|
||||
unsigned int register_extension(sc_type_index type)
|
||||
unsigned int
|
||||
register_extension(sc_type_index type)
|
||||
{
|
||||
type_map::const_iterator it = ids_.find( type );
|
||||
type_map::const_iterator it = ids_.find(type);
|
||||
|
||||
if( it == ids_.end() ) { // new extension - generate/store ID
|
||||
type_map::value_type v( type, static_cast<key_type>(ids_.size()) );
|
||||
ids_.insert( v );
|
||||
if (it == ids_.end()) {
|
||||
// New extension - generate/store ID.
|
||||
type_map::value_type v(type, static_cast<key_type>(ids_.size()));
|
||||
ids_.insert(v);
|
||||
return v.second;
|
||||
}
|
||||
return it->second;
|
||||
}
|
||||
|
||||
static unsigned int max_num_extensions()
|
||||
{ return (instance_) ? instance().ids_.size() : 0; }
|
||||
static unsigned int
|
||||
max_num_extensions()
|
||||
{
|
||||
return (instance_) ? instance().ids_.size() : 0;
|
||||
}
|
||||
|
||||
private:
|
||||
static tlm_extension_registry* instance_;
|
||||
private:
|
||||
static tlm_extension_registry *instance_;
|
||||
type_map ids_;
|
||||
tlm_extension_registry() /* = default */ {}
|
||||
tlm_extension_registry() {}
|
||||
|
||||
}; // class tlm_extension_registry
|
||||
};
|
||||
|
||||
tlm_extension_registry* tlm_extension_registry::instance_ = NULL;
|
||||
tlm_extension_registry *tlm_extension_registry::instance_ = NULL;
|
||||
|
||||
} // anonymous namespace
|
||||
} // anonymous namespace
|
||||
|
||||
unsigned int max_num_extensions()
|
||||
unsigned int
|
||||
max_num_extensions()
|
||||
{
|
||||
return tlm_extension_registry::max_num_extensions();
|
||||
}
|
||||
|
||||
unsigned int
|
||||
tlm_extension_base::register_extension(const std::type_info& type)
|
||||
tlm_extension_base::register_extension(const std::type_info &type)
|
||||
{
|
||||
return tlm_extension_registry::instance().register_extension(type);
|
||||
}
|
||||
@@ -87,203 +98,174 @@ tlm_extension_base::register_extension(const std::type_info& type)
|
||||
// The generic payload class:
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
//---------------
|
||||
// Constructors
|
||||
//---------------
|
||||
|
||||
// Default constructor
|
||||
tlm_generic_payload::tlm_generic_payload()
|
||||
: m_address(0)
|
||||
, m_command(TLM_IGNORE_COMMAND)
|
||||
, m_data(0)
|
||||
, m_length(0)
|
||||
, m_response_status(TLM_INCOMPLETE_RESPONSE)
|
||||
, m_dmi(false)
|
||||
, m_byte_enable(0)
|
||||
, m_byte_enable_length(0)
|
||||
, m_streaming_width(0)
|
||||
, m_gp_option(TLM_MIN_PAYLOAD)
|
||||
, m_extensions(max_num_extensions())
|
||||
, m_mm(0)
|
||||
, m_ref_count(0)
|
||||
tlm_generic_payload::tlm_generic_payload() : m_address(0),
|
||||
m_command(TLM_IGNORE_COMMAND), m_data(0), m_length(0),
|
||||
m_response_status(TLM_INCOMPLETE_RESPONSE), m_dmi(false), m_byte_enable(0),
|
||||
m_byte_enable_length(0), m_streaming_width(0),
|
||||
m_gp_option(TLM_MIN_PAYLOAD), m_extensions(max_num_extensions()), m_mm(0),
|
||||
m_ref_count(0)
|
||||
{}
|
||||
|
||||
tlm_generic_payload::tlm_generic_payload(tlm_mm_interface* mm)
|
||||
: m_address(0)
|
||||
, m_command(TLM_IGNORE_COMMAND)
|
||||
, m_data(0)
|
||||
, m_length(0)
|
||||
, m_response_status(TLM_INCOMPLETE_RESPONSE)
|
||||
, m_dmi(false)
|
||||
, m_byte_enable(0)
|
||||
, m_byte_enable_length(0)
|
||||
, m_streaming_width(0)
|
||||
, m_gp_option(TLM_MIN_PAYLOAD)
|
||||
, m_extensions(max_num_extensions())
|
||||
, m_mm(mm)
|
||||
, m_ref_count(0)
|
||||
tlm_generic_payload::tlm_generic_payload(tlm_mm_interface *mm): m_address(0),
|
||||
m_command(TLM_IGNORE_COMMAND), m_data(0), m_length(0),
|
||||
m_response_status(TLM_INCOMPLETE_RESPONSE), m_dmi(false), m_byte_enable(0),
|
||||
m_byte_enable_length(0), m_streaming_width(0),
|
||||
m_gp_option(TLM_MIN_PAYLOAD), m_extensions(max_num_extensions()), m_mm(mm),
|
||||
m_ref_count(0)
|
||||
{}
|
||||
|
||||
|
||||
void tlm_generic_payload::reset() {
|
||||
//should the other members be reset too?
|
||||
void
|
||||
tlm_generic_payload::reset()
|
||||
{
|
||||
// Should the other members be reset too?
|
||||
m_gp_option = TLM_MIN_PAYLOAD;
|
||||
m_extensions.free_entire_cache();
|
||||
};
|
||||
|
||||
|
||||
// non-virtual deep-copying of the object
|
||||
// Non-virtual deep-copying of the object.
|
||||
void
|
||||
tlm_generic_payload::deep_copy_from(const tlm_generic_payload & other)
|
||||
tlm_generic_payload::deep_copy_from(const tlm_generic_payload &other)
|
||||
{
|
||||
m_command = other.get_command();
|
||||
m_address = other.get_address();
|
||||
m_length = other.get_data_length();
|
||||
m_response_status = other.get_response_status();
|
||||
m_command = other.get_command();
|
||||
m_address = other.get_address();
|
||||
m_length = other.get_data_length();
|
||||
m_response_status = other.get_response_status();
|
||||
m_byte_enable_length = other.get_byte_enable_length();
|
||||
m_streaming_width = other.get_streaming_width();
|
||||
m_gp_option = other.get_gp_option();
|
||||
m_dmi = other.is_dmi_allowed();
|
||||
m_streaming_width = other.get_streaming_width();
|
||||
m_gp_option = other.get_gp_option();
|
||||
m_dmi = other.is_dmi_allowed();
|
||||
|
||||
// deep copy data
|
||||
// there must be enough space in the target transaction!
|
||||
if(m_data && other.m_data)
|
||||
{
|
||||
// Deep copy data.
|
||||
// There must be enough space in the target transaction!
|
||||
if (m_data && other.m_data) {
|
||||
std::memcpy(m_data, other.m_data, m_length);
|
||||
}
|
||||
// deep copy byte enables
|
||||
// there must be enough space in the target transaction!
|
||||
if(m_byte_enable && other.m_byte_enable)
|
||||
{
|
||||
// Deep copy byte enables.
|
||||
// There must be enough space in the target transaction!
|
||||
if (m_byte_enable && other.m_byte_enable) {
|
||||
std::memcpy(m_byte_enable, other.m_byte_enable, m_byte_enable_length);
|
||||
}
|
||||
// deep copy extensions (sticky and non-sticky)
|
||||
if(m_extensions.size() < other.m_extensions.size()) {
|
||||
// Deep copy extensions (sticky and non-sticky).
|
||||
if (m_extensions.size() < other.m_extensions.size()) {
|
||||
m_extensions.expand(other.m_extensions.size());
|
||||
}
|
||||
for(unsigned int i=0; i<other.m_extensions.size(); i++)
|
||||
{
|
||||
if(other.m_extensions[i])
|
||||
{ //original has extension i
|
||||
if(!m_extensions[i])
|
||||
{ //We don't: clone.
|
||||
for (unsigned int i = 0; i < other.m_extensions.size(); i++) {
|
||||
if (other.m_extensions[i]) {
|
||||
// Original has extension i.
|
||||
if (!m_extensions[i]) {
|
||||
// We don't: clone.
|
||||
tlm_extension_base *ext = other.m_extensions[i]->clone();
|
||||
if(ext) //extension may not be clonable.
|
||||
{
|
||||
if(has_mm())
|
||||
{ //mm can take care of removing cloned extensions
|
||||
if (ext) { // Extension may not be clonable.
|
||||
if (has_mm()) {
|
||||
// mm can take care of removing cloned extensions.
|
||||
set_auto_extension(i, ext);
|
||||
}
|
||||
else
|
||||
{ // no mm, user will call free_all_extensions().
|
||||
} else {
|
||||
// no mm, user will call free_all_extensions().
|
||||
set_extension(i, ext);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ //We already have such extension. Copy original over it.
|
||||
} else {
|
||||
// We already have such extension. Copy original over it.
|
||||
m_extensions[i]->copy_from(*other.m_extensions[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// To update the state of the original generic payload from a deep copy
|
||||
// Assumes that "other" was created from the original by calling deep_copy_from
|
||||
// Argument use_byte_enable_on_read determines whether to use or ignores byte enables
|
||||
// when copying back the data array on a read command
|
||||
// To update the state of the original generic payload from a deep copy.
|
||||
// Assumes that "other" was created from the original by calling
|
||||
// deep_copy_from. Argument use_byte_enable_on_read determines whether to use
|
||||
// or ignores byte enables when copying back the data array on a read command.
|
||||
|
||||
void
|
||||
tlm_generic_payload::update_original_from(const tlm_generic_payload & other,
|
||||
bool use_byte_enable_on_read)
|
||||
tlm_generic_payload::update_original_from(
|
||||
const tlm_generic_payload &other, bool use_byte_enable_on_read)
|
||||
{
|
||||
// Copy back extensions that are present on the original
|
||||
// Copy back extensions that are present on the original.
|
||||
update_extensions_from(other);
|
||||
|
||||
// Copy back the response status and DMI hint attributes
|
||||
// Copy back the response status and DMI hint attributes.
|
||||
m_response_status = other.get_response_status();
|
||||
m_dmi = other.is_dmi_allowed();
|
||||
m_dmi = other.is_dmi_allowed();
|
||||
|
||||
// Copy back the data array for a read command only
|
||||
// deep_copy_from allowed null pointers, and so will we
|
||||
// We assume the arrays are the same size
|
||||
// We test for equal pointers in case the original and the copy share the same array
|
||||
// Copy back the data array for a read command only deep_copy_from allowed
|
||||
// null pointers, and so will we.
|
||||
// We assume the arrays are the same size.
|
||||
// We test for equal pointers in case the original and the copy share the
|
||||
// same array.
|
||||
|
||||
if(is_read() && m_data && other.m_data && m_data != other.m_data)
|
||||
{
|
||||
if (m_byte_enable && use_byte_enable_on_read)
|
||||
{
|
||||
if (m_byte_enable_length == 8 && m_length % 8 == 0 )
|
||||
{
|
||||
// Optimized implementation copies 64-bit words by masking
|
||||
for (unsigned int i = 0; i < m_length; i += 8)
|
||||
{
|
||||
typedef sc_dt::uint64* u;
|
||||
*reinterpret_cast<u>(&m_data[i]) &= ~*reinterpret_cast<u>(m_byte_enable);
|
||||
*reinterpret_cast<u>(&m_data[i]) |= *reinterpret_cast<u>(&other.m_data[i]) &
|
||||
*reinterpret_cast<u>(m_byte_enable);
|
||||
if (is_read() && m_data && other.m_data && m_data != other.m_data) {
|
||||
if (m_byte_enable && use_byte_enable_on_read) {
|
||||
if (m_byte_enable_length == 8 && m_length % 8 == 0) {
|
||||
// Optimized implementation copies 64-bit words by masking.
|
||||
for (unsigned int i = 0; i < m_length; i += 8) {
|
||||
typedef sc_dt::uint64 *u;
|
||||
*reinterpret_cast<u>(&m_data[i]) &=
|
||||
~*reinterpret_cast<u>(m_byte_enable);
|
||||
*reinterpret_cast<u>(&m_data[i]) |=
|
||||
*reinterpret_cast<u>(&other.m_data[i]) &
|
||||
*reinterpret_cast<u>(m_byte_enable);
|
||||
}
|
||||
}
|
||||
else if (m_byte_enable_length == 4 && m_length % 4 == 0 )
|
||||
{
|
||||
// Optimized implementation copies 32-bit words by masking
|
||||
for (unsigned int i = 0; i < m_length; i += 4)
|
||||
{
|
||||
typedef unsigned int* u;
|
||||
*reinterpret_cast<u>(&m_data[i]) &= ~*reinterpret_cast<u>(m_byte_enable);
|
||||
*reinterpret_cast<u>(&m_data[i]) |= *reinterpret_cast<u>(&other.m_data[i]) &
|
||||
*reinterpret_cast<u>(m_byte_enable);
|
||||
} else if (m_byte_enable_length == 4 && m_length % 4 == 0) {
|
||||
// Optimized implementation copies 32-bit words by masking.
|
||||
for (unsigned int i = 0; i < m_length; i += 4) {
|
||||
typedef unsigned int *u;
|
||||
*reinterpret_cast<u>(&m_data[i]) &=
|
||||
~*reinterpret_cast<u>(m_byte_enable);
|
||||
*reinterpret_cast<u>(&m_data[i]) |=
|
||||
*reinterpret_cast<u>(&other.m_data[i]) &
|
||||
*reinterpret_cast<u>(m_byte_enable);
|
||||
}
|
||||
}
|
||||
else
|
||||
// Unoptimized implementation
|
||||
for (unsigned int i = 0; i < m_length; i++)
|
||||
if ( m_byte_enable[i % m_byte_enable_length] )
|
||||
} else {
|
||||
// Unoptimized implementation.
|
||||
for (unsigned int i = 0; i < m_length; i++) {
|
||||
if (m_byte_enable[i % m_byte_enable_length])
|
||||
m_data[i] = other.m_data[i];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
std::memcpy(m_data, other.m_data, m_length);
|
||||
}
|
||||
else
|
||||
std::memcpy(m_data, other.m_data, m_length);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
tlm_generic_payload::update_extensions_from(const tlm_generic_payload & other)
|
||||
tlm_generic_payload::update_extensions_from(const tlm_generic_payload &other)
|
||||
{
|
||||
// deep copy extensions that are already present
|
||||
// Deep copy extensions that are already present.
|
||||
sc_assert(m_extensions.size() <= other.m_extensions.size());
|
||||
for(unsigned int i=0; i<m_extensions.size(); i++)
|
||||
{
|
||||
if(other.m_extensions[i])
|
||||
{ //original has extension i
|
||||
if(m_extensions[i])
|
||||
{ //We have it too. copy.
|
||||
for (unsigned int i = 0; i < m_extensions.size(); i++) {
|
||||
if (other.m_extensions[i]) {
|
||||
// Original has extension i.
|
||||
if (m_extensions[i]) {
|
||||
// We have it too. Copy.
|
||||
m_extensions[i]->copy_from(*other.m_extensions[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Free all extensions. Useful when reusing a cloned transaction that doesn't have memory manager.
|
||||
// normal and sticky extensions are freed and extension array cleared.
|
||||
void tlm_generic_payload::free_all_extensions()
|
||||
// Free all extensions. Useful when reusing a cloned transaction that doesn't
|
||||
// have memory manager. Normal and sticky extensions are freed and extension
|
||||
// array cleared.
|
||||
void
|
||||
tlm_generic_payload::free_all_extensions()
|
||||
{
|
||||
m_extensions.free_entire_cache();
|
||||
for(unsigned int i=0; i<m_extensions.size(); i++)
|
||||
{
|
||||
if(m_extensions[i])
|
||||
{
|
||||
for (unsigned int i = 0; i < m_extensions.size(); i++) {
|
||||
if (m_extensions[i]) {
|
||||
m_extensions[i]->free();
|
||||
m_extensions[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------
|
||||
// Destructor
|
||||
//--------------
|
||||
tlm_generic_payload::~tlm_generic_payload() {
|
||||
for(unsigned int i=0; i<m_extensions.size(); i++)
|
||||
if(m_extensions[i]) m_extensions[i]->free();
|
||||
tlm_generic_payload::~tlm_generic_payload()
|
||||
{
|
||||
for (unsigned int i = 0; i < m_extensions.size(); i++) {
|
||||
if (m_extensions[i])
|
||||
m_extensions[i]->free();
|
||||
}
|
||||
}
|
||||
|
||||
//----------------
|
||||
@@ -293,15 +275,21 @@ tlm_generic_payload::~tlm_generic_payload() {
|
||||
std::string
|
||||
tlm_generic_payload::get_response_string() const
|
||||
{
|
||||
switch(m_response_status)
|
||||
{
|
||||
case TLM_OK_RESPONSE: return "TLM_OK_RESPONSE";
|
||||
case TLM_INCOMPLETE_RESPONSE: return "TLM_INCOMPLETE_RESPONSE";
|
||||
case TLM_GENERIC_ERROR_RESPONSE: return "TLM_GENERIC_ERROR_RESPONSE";
|
||||
case TLM_ADDRESS_ERROR_RESPONSE: return "TLM_ADDRESS_ERROR_RESPONSE";
|
||||
case TLM_COMMAND_ERROR_RESPONSE: return "TLM_COMMAND_ERROR_RESPONSE";
|
||||
case TLM_BURST_ERROR_RESPONSE: return "TLM_BURST_ERROR_RESPONSE";
|
||||
case TLM_BYTE_ENABLE_ERROR_RESPONSE: return "TLM_BYTE_ENABLE_ERROR_RESPONSE";
|
||||
switch (m_response_status) {
|
||||
case TLM_OK_RESPONSE:
|
||||
return "TLM_OK_RESPONSE";
|
||||
case TLM_INCOMPLETE_RESPONSE:
|
||||
return "TLM_INCOMPLETE_RESPONSE";
|
||||
case TLM_GENERIC_ERROR_RESPONSE:
|
||||
return "TLM_GENERIC_ERROR_RESPONSE";
|
||||
case TLM_ADDRESS_ERROR_RESPONSE:
|
||||
return "TLM_ADDRESS_ERROR_RESPONSE";
|
||||
case TLM_COMMAND_ERROR_RESPONSE:
|
||||
return "TLM_COMMAND_ERROR_RESPONSE";
|
||||
case TLM_BURST_ERROR_RESPONSE:
|
||||
return "TLM_BURST_ERROR_RESPONSE";
|
||||
case TLM_BYTE_ENABLE_ERROR_RESPONSE:
|
||||
return "TLM_BYTE_ENABLE_ERROR_RESPONSE";
|
||||
}
|
||||
return "TLM_UNKNOWN_RESPONSE";
|
||||
}
|
||||
@@ -310,56 +298,56 @@ tlm_generic_payload::get_response_string() const
|
||||
/* Dynamic extension mechanism: */
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
tlm_extension_base*
|
||||
tlm_generic_payload::set_extension(unsigned int index,
|
||||
tlm_extension_base* ext)
|
||||
tlm_extension_base *
|
||||
tlm_generic_payload::set_extension(unsigned int index, tlm_extension_base *ext)
|
||||
{
|
||||
sc_assert(index < m_extensions.size());
|
||||
tlm_extension_base* tmp = m_extensions[index];
|
||||
tlm_extension_base *tmp = m_extensions[index];
|
||||
m_extensions[index] = ext;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
tlm_extension_base*
|
||||
tlm_generic_payload::set_auto_extension(unsigned int index,
|
||||
tlm_extension_base* ext)
|
||||
tlm_extension_base *
|
||||
tlm_generic_payload::set_auto_extension(
|
||||
unsigned int index, tlm_extension_base *ext)
|
||||
{
|
||||
sc_assert(index < m_extensions.size());
|
||||
tlm_extension_base* tmp = m_extensions[index];
|
||||
tlm_extension_base *tmp = m_extensions[index];
|
||||
m_extensions[index] = ext;
|
||||
if (!tmp) m_extensions.insert_in_cache(&m_extensions[index]);
|
||||
if (!tmp)
|
||||
m_extensions.insert_in_cache(&m_extensions[index]);
|
||||
sc_assert(m_mm != 0);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
tlm_extension_base*
|
||||
tlm_extension_base *
|
||||
tlm_generic_payload::get_extension(unsigned int index) const
|
||||
{
|
||||
sc_assert(index < m_extensions.size());
|
||||
return m_extensions[index];
|
||||
}
|
||||
|
||||
void tlm_generic_payload::clear_extension(unsigned int index)
|
||||
void
|
||||
tlm_generic_payload::clear_extension(unsigned int index)
|
||||
{
|
||||
sc_assert(index < m_extensions.size());
|
||||
m_extensions[index] = static_cast<tlm_extension_base*>(0);
|
||||
m_extensions[index] = static_cast<tlm_extension_base *>(0);
|
||||
}
|
||||
|
||||
void tlm_generic_payload::release_extension(unsigned int index)
|
||||
void
|
||||
tlm_generic_payload::release_extension(unsigned int index)
|
||||
{
|
||||
sc_assert(index < m_extensions.size());
|
||||
if (m_mm)
|
||||
{
|
||||
if (m_mm) {
|
||||
m_extensions.insert_in_cache(&m_extensions[index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
m_extensions[index]->free();
|
||||
m_extensions[index] = static_cast<tlm_extension_base*>(0);
|
||||
m_extensions[index] = static_cast<tlm_extension_base *>(nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
void tlm_generic_payload::resize_extensions()
|
||||
void
|
||||
tlm_generic_payload::resize_extensions()
|
||||
{
|
||||
m_extensions.expand(max_num_extensions());
|
||||
}
|
||||
|
||||
@@ -17,97 +17,95 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_generic_payload/tlm_phase.h"
|
||||
#include "sysc/utils/sc_string_view.h"
|
||||
#include "sysc/utils/sc_typeindex.h"
|
||||
#include "sysc/utils/sc_report.h"
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <systemc>
|
||||
#include <tlm>
|
||||
|
||||
using sc_core::sc_string_view;
|
||||
using sc_core::sc_type_index;
|
||||
|
||||
namespace tlm {
|
||||
/* anonymous */ namespace {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
struct tlm_phase_registry
|
||||
{
|
||||
typedef unsigned int key_type;
|
||||
typedef unsigned int key_type;
|
||||
|
||||
static tlm_phase_registry& instance()
|
||||
{ static tlm_phase_registry inst; return inst; }
|
||||
|
||||
unsigned int register_phase(sc_type_index type, sc_string_view name)
|
||||
{
|
||||
type_map::const_iterator it = ids_.find( type );
|
||||
|
||||
if( name.empty() ) {
|
||||
SC_REPORT_FATAL( sc_core::SC_ID_INTERNAL_ERROR_,
|
||||
"unexpected empty tlm_phase name" );
|
||||
return UNINITIALIZED_PHASE;
|
||||
static tlm_phase_registry &
|
||||
instance()
|
||||
{
|
||||
static tlm_phase_registry inst;
|
||||
return inst;
|
||||
}
|
||||
|
||||
if( it == ids_.end() ) { // new phase - generate/store ID and name
|
||||
type_map::value_type v( type, static_cast<key_type>(names_.size()) );
|
||||
names_.push_back( name_table::value_type(name.data(), name.size()) );
|
||||
ids_.insert( v );
|
||||
return v.second;
|
||||
unsigned int
|
||||
register_phase(sc_type_index type, sc_string_view name)
|
||||
{
|
||||
type_map::const_iterator it = ids_.find(type);
|
||||
|
||||
if (name.empty()) {
|
||||
SC_REPORT_FATAL( sc_core::SC_ID_INTERNAL_ERROR_,
|
||||
"unexpected empty tlm_phase name" );
|
||||
return UNINITIALIZED_PHASE;
|
||||
}
|
||||
|
||||
if (it == ids_.end()) {
|
||||
// new phase - generate/store ID and name
|
||||
type_map::value_type v(type, static_cast<key_type>(names_.size()));
|
||||
names_.push_back(name_table::value_type(name.data(), name.size()));
|
||||
ids_.insert(v);
|
||||
return v.second;
|
||||
}
|
||||
|
||||
if (names_[it->second] != name) {
|
||||
SC_REPORT_FATAL(sc_core::SC_ID_INTERNAL_ERROR_,
|
||||
"tlm_phase registration failed: duplicate type info" );
|
||||
sc_core::sc_abort();
|
||||
}
|
||||
return it->second;
|
||||
}
|
||||
|
||||
if( names_[it->second] != name ) {
|
||||
SC_REPORT_FATAL( sc_core::SC_ID_INTERNAL_ERROR_,
|
||||
"tlm_phase registration failed: duplicate type info" );
|
||||
sc_core::sc_abort();
|
||||
const char *
|
||||
get_name(key_type id) const
|
||||
{
|
||||
sc_assert(id < names_.size());
|
||||
return names_[id].c_str();
|
||||
}
|
||||
return it->second;
|
||||
}
|
||||
|
||||
const char* get_name( key_type id ) const
|
||||
{
|
||||
sc_assert( id < names_.size() );
|
||||
return names_[id].c_str();
|
||||
}
|
||||
private:
|
||||
typedef std::map<sc_type_index, key_type> type_map;
|
||||
typedef std::vector<std::string> name_table;
|
||||
|
||||
private:
|
||||
typedef std::map<sc_type_index, key_type> type_map;
|
||||
typedef std::vector<std::string> name_table;
|
||||
type_map ids_;
|
||||
name_table names_;
|
||||
|
||||
type_map ids_;
|
||||
name_table names_;
|
||||
|
||||
tlm_phase_registry()
|
||||
: names_( END_RESP+1 )
|
||||
{
|
||||
# define BUILTIN_PHASE(phase) \
|
||||
names_[phase] = #phase
|
||||
|
||||
BUILTIN_PHASE( UNINITIALIZED_PHASE );
|
||||
BUILTIN_PHASE( BEGIN_REQ );
|
||||
BUILTIN_PHASE( END_REQ );
|
||||
BUILTIN_PHASE( BEGIN_RESP );
|
||||
BUILTIN_PHASE( END_RESP );
|
||||
}
|
||||
|
||||
}; // class tlm_phase_registry
|
||||
tlm_phase_registry() : names_(END_RESP + 1)
|
||||
{
|
||||
names_[UNINITIALIZED_PHASE] = "UNINITIALIZED_PHASE";
|
||||
names_[BEGIN_REQ] = "BEGIN_REQ";
|
||||
names_[END_REQ] = "END_REQ";
|
||||
names_[BEGIN_RESP] = "BEGIN_RESP";
|
||||
names_[END_RESP] = "END_RESP";
|
||||
}
|
||||
};
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
tlm_phase::tlm_phase( unsigned int id )
|
||||
: m_id(id)
|
||||
{
|
||||
// TODO: validate id?
|
||||
// TODO: add deprecation warning?
|
||||
}
|
||||
|
||||
tlm_phase::tlm_phase( const std::type_info& type, const char* name )
|
||||
: m_id( tlm_phase_registry::instance().register_phase(type, name) )
|
||||
tlm_phase::tlm_phase(unsigned int id) : m_id(id)
|
||||
{}
|
||||
|
||||
const char*
|
||||
tlm_phase::tlm_phase(const std::type_info &type, const char *name) :
|
||||
m_id(tlm_phase_registry::instance().register_phase(type, name))
|
||||
{}
|
||||
|
||||
const char *
|
||||
tlm_phase::get_name() const
|
||||
{
|
||||
return tlm_phase_registry::instance().get_name( m_id );
|
||||
return tlm_phase_registry::instance().get_name(m_id);
|
||||
}
|
||||
|
||||
} // namespace tlm
|
||||
// Taf!
|
||||
|
||||
@@ -17,33 +17,33 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#include "tlm_core/tlm_2/tlm_quantum/tlm_global_quantum.h"
|
||||
#include "sysc/kernel/sc_simcontext.h" // sc_time_stamp
|
||||
#include <systemc>
|
||||
#include <tlm>
|
||||
|
||||
namespace tlm {
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
tlm_global_quantum::tlm_global_quantum()
|
||||
: m_global_quantum(sc_core::SC_ZERO_TIME)
|
||||
tlm_global_quantum::tlm_global_quantum() :
|
||||
m_global_quantum(sc_core::SC_ZERO_TIME)
|
||||
{}
|
||||
|
||||
|
||||
tlm_global_quantum& tlm_global_quantum::instance()
|
||||
tlm_global_quantum &
|
||||
tlm_global_quantum::instance()
|
||||
{
|
||||
static tlm_global_quantum instance_;
|
||||
return instance_;
|
||||
static tlm_global_quantum instance_;
|
||||
return instance_;
|
||||
}
|
||||
|
||||
|
||||
sc_core::sc_time
|
||||
tlm_global_quantum::compute_local_quantum()
|
||||
{
|
||||
if (m_global_quantum != sc_core::SC_ZERO_TIME) {
|
||||
const sc_core::sc_time current = sc_core::sc_time_stamp();
|
||||
const sc_core::sc_time g_quant = m_global_quantum;
|
||||
return g_quant - (current % g_quant);
|
||||
} else {
|
||||
return sc_core::SC_ZERO_TIME;
|
||||
}
|
||||
if (m_global_quantum != sc_core::SC_ZERO_TIME) {
|
||||
const sc_core::sc_time current = sc_core::sc_time_stamp();
|
||||
const sc_core::sc_time g_quant = m_global_quantum;
|
||||
return g_quant - (current % g_quant);
|
||||
} else {
|
||||
return sc_core::SC_ZERO_TIME;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace tlm
|
||||
|
||||
@@ -17,68 +17,70 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#include "tlm_utils/convenience_socket_bases.h"
|
||||
#include <tlm_utils/convenience_socket_bases.h>
|
||||
|
||||
#include "sysc/kernel/sc_object.h"
|
||||
#include "sysc/kernel/sc_simcontext.h"
|
||||
#include "sysc/utils/sc_report.h"
|
||||
#include <sstream>
|
||||
#include <systemc>
|
||||
|
||||
namespace tlm_utils {
|
||||
namespace tlm_utils
|
||||
{
|
||||
|
||||
void
|
||||
convenience_socket_base::display_warning(const char* text) const
|
||||
convenience_socket_base::display_warning(const char *text) const
|
||||
{
|
||||
std::stringstream s;
|
||||
s << get_socket()->name() << ": " << text;
|
||||
SC_REPORT_WARNING(get_report_type(), s.str().c_str());
|
||||
}
|
||||
|
||||
void
|
||||
convenience_socket_base::display_error(const char* text) const
|
||||
{
|
||||
std::stringstream s;
|
||||
s << get_socket()->name() << ": " << text;
|
||||
SC_REPORT_ERROR(get_report_type(), s.str().c_str());
|
||||
}
|
||||
|
||||
//simple helpers for warnings an errors to shorten in code notation
|
||||
|
||||
void
|
||||
convenience_socket_cb_holder::display_warning(const char* msg) const
|
||||
{
|
||||
m_owner->display_warning(msg);
|
||||
}
|
||||
|
||||
void
|
||||
convenience_socket_cb_holder::display_error(const char* msg) const
|
||||
{
|
||||
m_owner->display_error(msg);
|
||||
}
|
||||
|
||||
const char*
|
||||
simple_socket_base::get_report_type() const {
|
||||
return "/OSCI_TLM-2/simple_socket";
|
||||
}
|
||||
|
||||
void
|
||||
simple_socket_base::elaboration_check(const char* action) const
|
||||
{
|
||||
if (sc_core::sc_get_curr_simcontext()->elaboration_done()) {
|
||||
std::stringstream s;
|
||||
s << " elaboration completed, " << action << " not allowed";
|
||||
display_error(s.str().c_str());
|
||||
}
|
||||
s << get_socket()->name() << ": " << text;
|
||||
SC_REPORT_WARNING(get_report_type(), s.str().c_str());
|
||||
}
|
||||
|
||||
const char*
|
||||
passthrough_socket_base::get_report_type() const {
|
||||
return "/OSCI_TLM-2/passthrough_socket";
|
||||
void
|
||||
convenience_socket_base::display_error(const char *text) const
|
||||
{
|
||||
std::stringstream s;
|
||||
s << get_socket()->name() << ": " << text;
|
||||
SC_REPORT_ERROR(get_report_type(), s.str().c_str());
|
||||
}
|
||||
|
||||
const char*
|
||||
multi_socket_base::get_report_type() const {
|
||||
return "/OSCI_TLM-2/multi_socket";
|
||||
// Simple helpers for warnings an errors to shorten in code notation.
|
||||
|
||||
void
|
||||
convenience_socket_cb_holder::display_warning(const char *msg) const
|
||||
{
|
||||
m_owner->display_warning(msg);
|
||||
}
|
||||
|
||||
void
|
||||
convenience_socket_cb_holder::display_error(const char *msg) const
|
||||
{
|
||||
m_owner->display_error(msg);
|
||||
}
|
||||
|
||||
const char *
|
||||
simple_socket_base::get_report_type() const
|
||||
{
|
||||
return "/OSCI_TLM-2/simple_socket";
|
||||
}
|
||||
|
||||
void
|
||||
simple_socket_base::elaboration_check(const char *action) const
|
||||
{
|
||||
if (sc_core::sc_get_curr_simcontext()->elaboration_done()) {
|
||||
std::stringstream s;
|
||||
s << " elaboration completed, " << action << " not allowed";
|
||||
display_error(s.str().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
const char *
|
||||
passthrough_socket_base::get_report_type() const
|
||||
{
|
||||
return "/OSCI_TLM-2/passthrough_socket";
|
||||
}
|
||||
|
||||
const char *
|
||||
multi_socket_base::get_report_type() const
|
||||
{
|
||||
return "/OSCI_TLM-2/multi_socket";
|
||||
}
|
||||
|
||||
} // namespace tlm_utils
|
||||
|
||||
@@ -17,233 +17,250 @@
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#include "tlm_utils/instance_specific_extensions_int.h"
|
||||
#include "sysc/utils/sc_typeindex.h" // sc_typeindex
|
||||
#include <tlm_utils/instance_specific_extensions_int.h>
|
||||
|
||||
#include <map>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <systemc>
|
||||
#include <tlm>
|
||||
|
||||
namespace tlm
|
||||
{
|
||||
|
||||
template class tlm_array<tlm_utils::ispex_base *>;
|
||||
|
||||
namespace tlm {
|
||||
template class SC_API tlm_array<tlm_utils::ispex_base*>;
|
||||
} // namespace tlm
|
||||
|
||||
namespace tlm_utils {
|
||||
/* anonymous */ namespace {
|
||||
class ispex_registry // copied from tlm_gp.cpp
|
||||
namespace tlm_utils
|
||||
{
|
||||
typedef unsigned int key_type;
|
||||
typedef std::map<sc_core::sc_type_index, key_type> type_map;
|
||||
public:
|
||||
static ispex_registry& instance()
|
||||
{
|
||||
if (!instance_) // don't cleanup registry
|
||||
instance_ = new ispex_registry();
|
||||
return *instance_;
|
||||
}
|
||||
|
||||
unsigned int register_extension(sc_core::sc_type_index type)
|
||||
{
|
||||
type_map::const_iterator it = ids_.find( type );
|
||||
namespace
|
||||
{
|
||||
|
||||
if( it == ids_.end() ) { // new extension - generate/store ID
|
||||
type_map::value_type v( type, static_cast<key_type>(ids_.size()) );
|
||||
ids_.insert( v );
|
||||
return v.second;
|
||||
class ispex_registry // Copied from tlm_gp.cpp.
|
||||
{
|
||||
typedef unsigned int key_type;
|
||||
typedef std::map<sc_core::sc_type_index, key_type> type_map;
|
||||
|
||||
public:
|
||||
static ispex_registry &
|
||||
instance()
|
||||
{
|
||||
if (!instance_) {
|
||||
// Don't cleanup registry.
|
||||
instance_ = new ispex_registry();
|
||||
}
|
||||
return *instance_;
|
||||
}
|
||||
return it->second;
|
||||
}
|
||||
|
||||
static unsigned int max_num_extensions()
|
||||
{ return (instance_) ? instance().ids_.size() : 0; }
|
||||
unsigned int
|
||||
register_extension(sc_core::sc_type_index type)
|
||||
{
|
||||
type_map::const_iterator it = ids_.find(type);
|
||||
|
||||
private:
|
||||
static ispex_registry* instance_;
|
||||
type_map ids_;
|
||||
ispex_registry() /* = default */ {}
|
||||
if (it == ids_.end()) {
|
||||
// New extension - generate/store ID.
|
||||
type_map::value_type v(type, static_cast<key_type>(ids_.size()));
|
||||
ids_.insert(v);
|
||||
return v.second;
|
||||
}
|
||||
return it->second;
|
||||
}
|
||||
|
||||
}; // class ispex_registry
|
||||
static unsigned int
|
||||
max_num_extensions()
|
||||
{
|
||||
return (instance_) ? instance().ids_.size() : 0;
|
||||
}
|
||||
|
||||
private:
|
||||
static ispex_registry *instance_;
|
||||
type_map ids_;
|
||||
ispex_registry() {}
|
||||
};
|
||||
|
||||
ispex_registry *ispex_registry::instance_ = nullptr;
|
||||
|
||||
ispex_registry* ispex_registry::instance_ = NULL;
|
||||
} // anonymous namespace
|
||||
|
||||
unsigned int
|
||||
ispex_base::register_private_extension(const std::type_info& type)
|
||||
ispex_base::register_private_extension(const std::type_info &type)
|
||||
{
|
||||
return ispex_registry::instance().register_extension(type);
|
||||
return ispex_registry::instance().register_extension(type);
|
||||
}
|
||||
|
||||
//Helper to do the numbering of private extension accessors
|
||||
static unsigned int max_num_ispex_accessors(bool increment=false)
|
||||
// Helper to do the numbering of private extension accessors.
|
||||
static unsigned int
|
||||
max_num_ispex_accessors(bool increment=false)
|
||||
{
|
||||
static unsigned int max_num = 0;
|
||||
if (increment) ++max_num;
|
||||
if (increment)
|
||||
++max_num;
|
||||
return max_num;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
//the pool for the container, plain as can be
|
||||
// The pool for the container, plain as can be.
|
||||
class instance_specific_extension_container_pool
|
||||
{
|
||||
instance_specific_extension_container_pool()
|
||||
: unused(NULL){}
|
||||
instance_specific_extension_container_pool() : unused(nullptr) {}
|
||||
~instance_specific_extension_container_pool();
|
||||
|
||||
~instance_specific_extension_container_pool();
|
||||
public:
|
||||
static instance_specific_extension_container_pool &
|
||||
instance()
|
||||
{
|
||||
static instance_specific_extension_container_pool inst;
|
||||
return inst;
|
||||
}
|
||||
|
||||
public:
|
||||
static instance_specific_extension_container_pool& instance()
|
||||
{
|
||||
static instance_specific_extension_container_pool inst;
|
||||
return inst;
|
||||
}
|
||||
instance_specific_extension_container *create();
|
||||
void free(instance_specific_extension_container *);
|
||||
|
||||
instance_specific_extension_container* create();
|
||||
void free(instance_specific_extension_container*);
|
||||
private:
|
||||
instance_specific_extension_container *unused;
|
||||
};
|
||||
|
||||
private:
|
||||
instance_specific_extension_container* unused;
|
||||
}; // class instance_specific_extension_container_pool
|
||||
|
||||
instance_specific_extension_container*
|
||||
instance_specific_extension_container *
|
||||
instance_specific_extension_container_pool::create()
|
||||
{
|
||||
if (!unused) {
|
||||
unused =new instance_specific_extension_container();
|
||||
}
|
||||
instance_specific_extension_container* tmp = unused;
|
||||
unused = unused->next;
|
||||
return tmp;
|
||||
if (!unused) {
|
||||
unused = new instance_specific_extension_container();
|
||||
}
|
||||
instance_specific_extension_container *tmp = unused;
|
||||
unused = unused->next;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
void
|
||||
instance_specific_extension_container_pool::
|
||||
free(instance_specific_extension_container* cont)
|
||||
instance_specific_extension_container_pool::free(
|
||||
instance_specific_extension_container *cont)
|
||||
{
|
||||
cont->next=unused;
|
||||
unused=cont;
|
||||
cont->next = unused;
|
||||
unused = cont;
|
||||
}
|
||||
|
||||
instance_specific_extension_container_pool::
|
||||
~instance_specific_extension_container_pool()
|
||||
~instance_specific_extension_container_pool()
|
||||
{
|
||||
while(unused) {
|
||||
instance_specific_extension_container* tmp = unused;
|
||||
unused=unused->next;
|
||||
delete tmp;
|
||||
}
|
||||
while (unused) {
|
||||
instance_specific_extension_container *tmp = unused;
|
||||
unused = unused->next;
|
||||
delete tmp;
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
instance_specific_extension_container*
|
||||
instance_specific_extension_container *
|
||||
instance_specific_extension_container::create()
|
||||
{
|
||||
return instance_specific_extension_container_pool::instance().create();
|
||||
return instance_specific_extension_container_pool::instance().create();
|
||||
}
|
||||
|
||||
instance_specific_extension_container::instance_specific_extension_container()
|
||||
: use_count(0)
|
||||
, m_txn(NULL)
|
||||
, m_release_fn(NULL)
|
||||
, m_carrier(NULL)
|
||||
, next(NULL)
|
||||
instance_specific_extension_container::
|
||||
instance_specific_extension_container() :
|
||||
use_count(0), m_txn(NULL), m_release_fn(NULL), m_carrier(NULL), next(NULL)
|
||||
{
|
||||
resize();
|
||||
resize();
|
||||
}
|
||||
|
||||
void
|
||||
instance_specific_extension_container::
|
||||
attach_carrier(instance_specific_extension_carrier* carrier,
|
||||
void* txn, release_fn* rel_fn)
|
||||
attach_carrier(instance_specific_extension_carrier *carrier,
|
||||
void *txn, release_fn *rel_fn)
|
||||
{
|
||||
m_txn = txn;
|
||||
m_release_fn = rel_fn;
|
||||
m_carrier = carrier;
|
||||
m_txn = txn;
|
||||
m_release_fn = rel_fn;
|
||||
m_carrier = carrier;
|
||||
}
|
||||
|
||||
void
|
||||
instance_specific_extension_container::resize()
|
||||
{
|
||||
m_ispex_per_accessor.resize( max_num_ispex_accessors() );
|
||||
m_ispex_per_accessor.resize(max_num_ispex_accessors());
|
||||
|
||||
for (unsigned int i=0; i < m_ispex_per_accessor.size(); ++i) {
|
||||
m_ispex_per_accessor[i] = new instance_specific_extensions_per_accessor(this);
|
||||
m_ispex_per_accessor[i]->resize_extensions();
|
||||
}
|
||||
for (unsigned int i = 0; i < m_ispex_per_accessor.size(); ++i) {
|
||||
m_ispex_per_accessor[i] =
|
||||
new instance_specific_extensions_per_accessor(this);
|
||||
m_ispex_per_accessor[i]->resize_extensions();
|
||||
}
|
||||
}
|
||||
|
||||
instance_specific_extension_container::
|
||||
~instance_specific_extension_container()
|
||||
~instance_specific_extension_container()
|
||||
{
|
||||
for (unsigned int i=0; i<m_ispex_per_accessor.size(); ++i)
|
||||
delete m_ispex_per_accessor[i];
|
||||
for (unsigned int i = 0; i < m_ispex_per_accessor.size(); ++i)
|
||||
delete m_ispex_per_accessor[i];
|
||||
}
|
||||
|
||||
void
|
||||
instance_specific_extension_container::inc_use_count()
|
||||
{
|
||||
use_count++;
|
||||
use_count++;
|
||||
}
|
||||
|
||||
void
|
||||
instance_specific_extension_container::dec_use_count()
|
||||
{
|
||||
if ((--use_count)==0) { // if this container isn't used any more
|
||||
// we release the carrier extension
|
||||
m_release_fn(m_carrier, m_txn);
|
||||
// we send it back to our pool
|
||||
instance_specific_extension_container_pool::instance().free(this);
|
||||
}
|
||||
if ((--use_count) == 0) {
|
||||
// If this container isn't used any more we release the carrier
|
||||
// extension.
|
||||
m_release_fn(m_carrier, m_txn);
|
||||
// We send it back to our pool.
|
||||
instance_specific_extension_container_pool::instance().free(this);
|
||||
}
|
||||
}
|
||||
|
||||
instance_specific_extensions_per_accessor*
|
||||
instance_specific_extensions_per_accessor *
|
||||
instance_specific_extension_container::get_accessor(unsigned int idx)
|
||||
{
|
||||
return m_ispex_per_accessor[idx];
|
||||
return m_ispex_per_accessor[idx];
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// non-templatized version with manual index:
|
||||
ispex_base*
|
||||
instance_specific_extensions_per_accessor::
|
||||
set_extension(unsigned int index, ispex_base* ext)
|
||||
ispex_base *
|
||||
instance_specific_extensions_per_accessor::set_extension(
|
||||
unsigned int index, ispex_base *ext)
|
||||
{
|
||||
resize_extensions();
|
||||
ispex_base* tmp = m_extensions[index];
|
||||
m_extensions[index] = ext;
|
||||
if (!tmp && ext) m_container->inc_use_count();
|
||||
return tmp;
|
||||
resize_extensions();
|
||||
ispex_base *tmp = m_extensions[index];
|
||||
m_extensions[index] = ext;
|
||||
if (!tmp && ext)
|
||||
m_container->inc_use_count();
|
||||
return tmp;
|
||||
}
|
||||
|
||||
ispex_base*
|
||||
instance_specific_extensions_per_accessor::
|
||||
get_extension(unsigned int index) const
|
||||
ispex_base *
|
||||
instance_specific_extensions_per_accessor::get_extension(
|
||||
unsigned int index) const
|
||||
{
|
||||
return (index < m_extensions.size()) ? m_extensions[index] : NULL;
|
||||
return (index < m_extensions.size()) ? m_extensions[index] : nullptr;
|
||||
}
|
||||
|
||||
void
|
||||
instance_specific_extensions_per_accessor::
|
||||
clear_extension(unsigned int index)
|
||||
instance_specific_extensions_per_accessor::clear_extension(unsigned int index)
|
||||
{
|
||||
if (index < m_extensions.size())
|
||||
{
|
||||
if (m_extensions[index]) m_container->dec_use_count();
|
||||
m_extensions[index] = static_cast<ispex_base*>(0);
|
||||
}
|
||||
if (index < m_extensions.size()) {
|
||||
if (m_extensions[index])
|
||||
m_container->dec_use_count();
|
||||
m_extensions[index] = static_cast<ispex_base *>(nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
instance_specific_extensions_per_accessor::resize_extensions()
|
||||
{
|
||||
m_extensions.expand(ispex_registry::max_num_extensions());
|
||||
m_extensions.expand(ispex_registry::max_num_extensions());
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
instance_specific_extension_accessor::instance_specific_extension_accessor()
|
||||
: m_index(max_num_ispex_accessors(true)-1)
|
||||
instance_specific_extension_accessor::instance_specific_extension_accessor() :
|
||||
m_index(max_num_ispex_accessors(true) - 1)
|
||||
{}
|
||||
|
||||
} // namespace tlm_utils
|
||||
|
||||
Reference in New Issue
Block a user