Jerome, All,
The next item on the list is virtual bind operators. I include the text
from Jerome's original proposal below.
Thoughts?
John A
Another area that can be improved with only minor changes is the
sc_port/sc_export classes:
* The various bind() and operator() methods are not declared virtual. This
means that when someone wants to overload these methods in a user class
derived from sc_port or sc_export, he has to declare and provide
implementation for all the variants. For instance the user could want to
overload the sc_port binding to an interface, and he has to also declare
and implement all the other bindings. This is a real pain when
implementing user protocol classes derived from sc_port or sc_export.
* Similarly, I would propose to declare virtual the various bind() and
operator() methods in the TLM 2.0 sockets classes
(tlm_base_initiator_socket and tlm_base_target_socket).
* The class sc_port is template on IF (interface), N (max number of
connections) and POL (policy), and derives from the sc_port_base class.
* The declaration of sc_port binding on another sc_port does not seems
consistent:
void bind(sc_port<IF, N> &);
This means that a sc_port "templatized" with N=2 can only connect to
another port that is "templatized" with the very same N whereas you can
logically connect a sc_port with N=2 to 2 sc_port that would have N=1 (for
instance). In this area, I have seen many implementations (including the
reference OSCI implementation) that just don't comply with the norm in
order to allow these logical connections.
So, what is needed is something like this:
virtual void bind("any_port" &);
sc_port_base could be a candidate for "any_port" but it is not template on
IF. Actually, if we look at some implementations, we see that they do use
an intermediate class called sc_port_b, that is template on IF.
So the proposal is:
- Standardize the class sc_port_b<IF>, that inherits from sc_port_base and
that contains the following bind/operator functions:
virtual void operator() (IF &);
virtual void operator() (sc_port_b<IF> &);
virtual void bind(IF &);
virtual void bind(sc_port_b<IF> &);
The class sc_port would then inherit from sc_port_b. This is just a
standardization (+ virtual keyword) of what is already implemented in many
simulators, including the OSCI reference one. Any user that implements
class derived from sc_port will need that sc_port_b class for the same
reason. A perfect example of that are the OSCI TLM 2.0 sockets, that
explictly make use of sc_port_b (see tlm_base_initiator_socket_b and
tlm_base_target_socket_b) to allow binding of sockets with different N and
POL parameters, but with matching BUSWIDTH, FW_IF and BW_IF.
-- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean.Received on Wed Oct 13 07:14:53 2010
This archive was generated by hypermail 2.1.8 : Wed Oct 13 2010 - 07:14:57 PDT