[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r3985 - gnuradio/branches/developers/eb/mb/mblock/src/
From: |
eb |
Subject: |
[Commit-gnuradio] r3985 - gnuradio/branches/developers/eb/mb/mblock/src/lib |
Date: |
Tue, 14 Nov 2006 15:03:13 -0700 (MST) |
Author: eb
Date: 2006-11-14 15:03:12 -0700 (Tue, 14 Nov 2006)
New Revision: 3985
Added:
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_util.cc
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_util.h
Modified:
gnuradio/branches/developers/eb/mb/mblock/src/lib/Makefile.am
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.h
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port.h
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_class.cc
gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_class.h
gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_prims.cc
Log:
connect (except for relay ports) seems to be working OK.
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/Makefile.am
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/Makefile.am
2006-11-14 21:37:23 UTC (rev 3984)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/Makefile.am
2006-11-14 22:03:12 UTC (rev 3985)
@@ -41,7 +41,8 @@
mb_port_class.cc \
mb_protocol_class.cc \
mb_runtime.cc \
- mb_runtime_impl.cc
+ mb_runtime_impl.cc \
+ mb_util.cc
# magic flags
@@ -60,7 +61,8 @@
mb_port.h \
mb_port_class.h \
mb_protocol_class.h \
- mb_runtime.h
+ mb_runtime.h \
+ mb_util.h
noinst_HEADERS = \
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc
2006-11-14 21:37:23 UTC (rev 3984)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.cc
2006-11-14 22:03:12 UTC (rev 3985)
@@ -25,7 +25,9 @@
#include <mb_exception.h>
#include <mb_mblock.h>
+#include <mb_util.h>
+
mbe_base::mbe_base(mb_mblock *mb, const std::string &msg)
: logic_error(msg) // FIXME extract block class name and id and add to msg
{
@@ -55,9 +57,19 @@
mbe_already_connected::mbe_already_connected(mb_mblock *mb,
const std::string &comp_name,
const std::string &port_name)
- : mbe_base(mb, "Port already connected: " + comp_name + "/" + port_name)
+ : mbe_base(mb, "Port already connected: " + mb_util::join_names(comp_name,
port_name))
{
}
+mbe_incompatible_ports::mbe_incompatible_ports(mb_mblock *mb,
+ const std::string &comp1_name,
+ const std::string &port1_name,
+ const std::string &comp2_name,
+ const std::string &port2_name)
+ : mbe_base(mb, "Incompatible ports: "
+ + mb_util::join_names(comp1_name, port1_name) + " "
+ + mb_util::join_names(comp2_name, port2_name))
+{
+}
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h
2006-11-14 21:37:23 UTC (rev 3984)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_exception.h
2006-11-14 22:03:12 UTC (rev 3985)
@@ -65,6 +65,16 @@
const std::string &port_name);
};
+class mbe_incompatible_ports : public mbe_base
+{
+public:
+ mbe_incompatible_ports(mb_mblock *,
+ const std::string &comp1_name,
+ const std::string &port1_name,
+ const std::string &comp2_name,
+ const std::string &port2_name);
+};
+
#endif /* INCLUDED_MB_EXCEPTION_H */
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.h
2006-11-14 21:37:23 UTC (rev 3984)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock.h
2006-11-14 22:03:12 UTC (rev 3985)
@@ -44,6 +44,7 @@
mb_mblock_impl *d_impl; // implementation details
friend class mb_runtime;
+ friend class mb_mblock_impl;
protected:
/*!
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc
2006-11-14 21:37:23 UTC (rev 3984)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.cc
2006-11-14 22:03:12 UTC (rev 3985)
@@ -27,6 +27,7 @@
#include <mb_protocol_class.h>
#include <mb_port.h>
#include <mb_exception.h>
+#include <mb_util.h>
static pmt_t s_self = pmt_intern("self");
@@ -75,40 +76,6 @@
d_port_map[port_name] = p;
}
-mb_endpoint
-mb_mblock_impl::check_and_resolve_endpoint(const std::string &comp_name,
- const std::string &port_name)
-{
- mb_conn_iter it;
- int which_ep;
- mb_port_sptr port = resolve_port(comp_name, port_name);
-
- // Is this endpoint already bound?
- if (d_conn_table.lookup_conn_by_name(comp_name, port_name, &it, &which_ep))
- throw mbe_already_connected(d_mb, comp_name, port_name);
-
- return mb_endpoint(comp_name, port_name, port);
-}
-
-mb_port_sptr
-mb_mblock_impl::resolve_port(const std::string &comp_name,
- const std::string &port_name)
-{
- if (comp_name == "self"){
- if (!port_is_defined(port_name))
- throw mbe_no_such_port(d_mb, port_name);
- return d_port_map[port_name];
- }
- else {
- // FIXME
- throw mbe_no_such_port(d_mb, port_name);
- }
-
- // return mb_port_sptr();
-}
-
-
-
void
mb_mblock_impl::define_component(const std::string &name,
mb_mblock_sptr component)
@@ -125,6 +92,14 @@
{
mb_endpoint ep0 = check_and_resolve_endpoint(comp_name1, port_name1);
mb_endpoint ep1 = check_and_resolve_endpoint(comp_name2, port_name2);
+
+ if (!ports_are_compatible(ep0.port(), ep1.port()))
+ throw mbe_incompatible_ports(d_mb,
+ comp_name1, port_name1,
+ comp_name2, port_name2);
+ // FIXME more checks?
+
+ d_conn_table.create_conn(ep0, ep1);
}
void
@@ -152,3 +127,66 @@
{
// FIXME
}
+
+////////////////////////////////////////////////////////////////////////
+
+mb_endpoint
+mb_mblock_impl::check_and_resolve_endpoint(const std::string &comp_name,
+ const std::string &port_name)
+{
+ mb_conn_iter it;
+ int which_ep;
+ mb_port_sptr port = resolve_port(comp_name, port_name);
+
+ // Is this endpoint already bound?
+ if (d_conn_table.lookup_conn_by_name(comp_name, port_name, &it, &which_ep))
+ throw mbe_already_connected(d_mb, comp_name, port_name);
+
+ return mb_endpoint(comp_name, port_name, port);
+}
+
+mb_port_sptr
+mb_mblock_impl::resolve_port(const std::string &comp_name,
+ const std::string &port_name)
+{
+ if (comp_name == "self"){
+ // Look through our ports.
+ if (!port_is_defined(port_name))
+ throw mbe_no_such_port(d_mb, mb_util::join_names("self", port_name));
+ return d_port_map[port_name];
+ }
+ else {
+ // Look through the specified child's ports.
+ if (!comp_is_defined(comp_name))
+ throw mbe_no_such_component(d_mb, comp_name);
+
+ mb_mblock_impl *c_impl = d_comp_map[comp_name]->d_impl; // childs impl
pointer
+ if (!c_impl->port_is_defined(port_name))
+ throw mbe_no_such_port(d_mb, mb_util::join_names(comp_name, port_name));
+
+ mb_port_sptr c_port = c_impl->d_port_map[port_name];
+
+ if (c_port->port_type() == mb_port_class::INTERNAL) // can't
"see" a child's internal ports
+ throw mbe_no_such_port(d_mb, mb_util::join_names(comp_name, port_name));
+
+ return c_port;
+ }
+}
+
+
+
+bool
+mb_mblock_impl::ports_are_compatible(mb_port_sptr p0, mb_port_sptr p1)
+{
+ using std::cout;
+ using std::endl;
+
+ pmt_t p0_outgoing = p0->outgoing_message_set();
+ pmt_t p0_incoming = p0->incoming_message_set();
+
+ pmt_t p1_outgoing = p1->outgoing_message_set();
+ pmt_t p1_incoming = p1->incoming_message_set();
+
+ return (pmt_subsetp(p0_outgoing, p1_incoming)
+ && pmt_subsetp(p1_outgoing, p0_incoming));
+}
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h
2006-11-14 21:37:23 UTC (rev 3984)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_mblock_impl.h
2006-11-14 22:03:12 UTC (rev 3985)
@@ -27,30 +27,10 @@
#include <map>
-#if 0
-/*!
- * \brief Define an operator usable for a comparison function for pmt_t's
- *
- * This sorts them by address, not particularly useful, but does
- * keep the std::map template happy.
- */
-struct _pmt_less {
- bool operator()(const pmt_t a, const pmt_t b) const {
- return (unsigned long int) a.get() < (unsigned long int) b.get();
- }
-};
-
-typedef std::map<pmt_t, mb_port_sptr, _pmt_less> mb_port_map_t;
-typedef std::map<pmt_t, mb_mblock_sptr, _pmt_less> mb_comp_map_t;
-
-#else
-
typedef std::map<std::string, mb_port_sptr> mb_port_map_t;
typedef std::map<std::string, mb_mblock_sptr> mb_comp_map_t;
-#endif
-
/*!
* \brief The private implementation details of the mblock system.
*/
@@ -176,19 +156,14 @@
check_and_resolve_endpoint(const std::string &comp_name,
const std::string &port_name);
-#if 0
- mb_port_sptr
- resolve_our_port(const std::string &port_name);
mb_port_sptr
- resolve_childs_port(const std::string &comp_name,
- const std::string &port_name);
-#endif
-
- mb_port_sptr
resolve_port(const std::string &comp_name,
const std::string &port_name);
+ static bool
+ ports_are_compatible(mb_port_sptr p0, mb_port_sptr p1);
+
};
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port.h 2006-11-14
21:37:23 UTC (rev 3984)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port.h 2006-11-14
22:03:12 UTC (rev 3985)
@@ -55,6 +55,8 @@
pmt_t protocol_class() const { return
d_port_class->protocol_class(); }
bool conjugated() const { return
d_port_class->conjugated(); }
mb_port_class::port_type_t port_type() const { return
d_port_class->port_type(); }
+ pmt_t incoming_message_set() const { return
d_port_class->incoming_message_set(); }
+ pmt_t outgoing_message_set() const { return
d_port_class->outgoing_message_set(); }
};
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_class.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_class.cc
2006-11-14 21:37:23 UTC (rev 3984)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_class.cc
2006-11-14 22:03:12 UTC (rev 3985)
@@ -51,3 +51,21 @@
}
d_protocol_class = pc;
}
+
+pmt_t
+mb_port_class::incoming_message_set() const
+{
+ if (!conjugated())
+ return mb_protocol_class_incoming(protocol_class());
+ else // swap the sets
+ return mb_protocol_class_outgoing(protocol_class());
+}
+
+pmt_t
+mb_port_class::outgoing_message_set() const
+{
+ if (!conjugated())
+ return mb_protocol_class_outgoing(protocol_class());
+ else // swap the sets
+ return mb_protocol_class_incoming(protocol_class());
+}
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_class.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_class.h
2006-11-14 21:37:23 UTC (rev 3984)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_port_class.h
2006-11-14 22:03:12 UTC (rev 3985)
@@ -61,6 +61,9 @@
pmt_t protocol_class() const { return d_protocol_class; }
bool conjugated() const { return d_conjugated; }
port_type_t port_type() const { return d_port_type; }
+
+ pmt_t incoming_message_set() const;
+ pmt_t outgoing_message_set() const;
};
/*!
Added: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_util.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_util.cc
(rev 0)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_util.cc
2006-11-14 22:03:12 UTC (rev 3985)
@@ -0,0 +1,34 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <mb_util.h>
+
+
+std::string
+mb_util::join_names(const std::string &comp_name,
+ const std::string &port_name)
+{
+ return comp_name + "/" + port_name;
+}
Added: gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_util.h
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_util.h
(rev 0)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/mb_util.h 2006-11-14
22:03:12 UTC (rev 3985)
@@ -0,0 +1,35 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef INCLUDED_MB_UTIL_H
+#define INCLUDED_MB_UTIL_H
+
+#include <string>
+
+class mb_util
+{
+public:
+ static std::string
+ join_names(const std::string &comp_name,
+ const std::string &port_name);
+};
+
+#endif /* INCLUDED_MB_UTIL_H */
Modified: gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_prims.cc
===================================================================
--- gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_prims.cc
2006-11-14 21:37:23 UTC (rev 3984)
+++ gnuradio/branches/developers/eb/mb/mblock/src/lib/qa_mblock_prims.cc
2006-11-14 22:03:12 UTC (rev 3985)
@@ -192,55 +192,67 @@
// ================================================================
-class tc_in : public mb_mblock
+class tc_norm : public mb_mblock
{
public:
- tc_in(){
- define_port("data", "data", false, mb_port_class::EXTERNAL);
+ tc_norm(){
+ define_port("data", "i/o", false, mb_port_class::EXTERNAL);
+ define_port("norm", "i/o", false, mb_port_class::EXTERNAL);
+ define_port("conj", "i/o", true, mb_port_class::EXTERNAL);
+ define_port("int", "i/o", false, mb_port_class::INTERNAL);
}
- ~tc_in();
+ ~tc_norm();
};
-tc_in::~tc_in(){}
+tc_norm::~tc_norm(){}
////////////////////////////////////////////////////////////////
-class tc_out : public mb_mblock
-{
-public:
- tc_out(){
- define_port("data", "data", true, mb_port_class::EXTERNAL);
- }
-
- ~tc_out();
-};
-
-tc_out::~tc_out(){}
-
-////////////////////////////////////////////////////////////////
-
class tc_0 : public mb_mblock
{
public:
tc_0(){
- define_component("cin0", mb_mblock_sptr(new tc_in()));
- define_component("cin1", mb_mblock_sptr(new tc_in()));
- define_component("cout0", mb_mblock_sptr(new tc_out()));
+ define_port("norm", "i/o", false, mb_port_class::EXTERNAL);
+ define_port("int", "i/o", false, mb_port_class::INTERNAL);
+ define_component("c0", mb_mblock_sptr(new tc_norm()));
+ define_component("c1", mb_mblock_sptr(new tc_norm()));
+ define_component("c2", mb_mblock_sptr(new tc_norm()));
+ define_component("c3", mb_mblock_sptr(new tc_norm()));
+
// OK
- connect("cin0", "data", "cout0", "data");
+ connect("c0", "norm", "c1", "conj");
// No: No such component name
- CPPUNIT_ASSERT_THROW(connect("foo", "data", "cout0", "data"),
mbe_no_such_component);
+ CPPUNIT_ASSERT_THROW(connect("foo", "data", "c1", "norm"),
mbe_no_such_component);
// No: No such port name
- CPPUNIT_ASSERT_THROW(connect("cin0", "data", "cout0", "foo"),
mbe_no_such_port);
+ CPPUNIT_ASSERT_THROW(connect("c0", "data", "c1", "foo"), mbe_no_such_port);
-#if 0
+ // No: already connected
+ CPPUNIT_ASSERT_THROW(connect("c0", "norm", "c2", "data"),
mbe_already_connected);
+
+ // No: already connected
+ CPPUNIT_ASSERT_THROW(connect("c2", "data", "c0", "norm"),
mbe_already_connected);
+
// No: incompatible ports
- CPPUNIT_ASSERT_THROW(connect("cin0", "data", "cin1", "data"),
mbe_incompatible_ports);
-#endif
+ CPPUNIT_ASSERT_THROW(connect("c1", "norm", "c2", "norm"),
mbe_incompatible_ports);
+
+ // OK
+ connect("c1", "norm", "c2", "conj");
+
+ // No: No such port name
+ CPPUNIT_ASSERT_THROW(connect("c2", "norm", "self", "foo"),
mbe_no_such_port);
+
+ // No: can't connect to child's internal port
+ CPPUNIT_ASSERT_THROW(connect("c0", "conj", "c2", "int"), mbe_no_such_port);
+
+ // OK
+ connect("self", "norm", "c0", "conj");
+
+ // OK: connecting to one of our internal ports
+ connect("self", "int", "c3", "conj");
}
~tc_0();
@@ -254,10 +266,10 @@
{
public:
tc_1(){
- define_component("c0", mb_mblock_sptr(new tc_in()));
- define_component("c1", mb_mblock_sptr(new tc_in()));
+ define_component("c0", mb_mblock_sptr(new tc_norm()));
+ define_component("c1", mb_mblock_sptr(new tc_norm()));
- connect("c0", "in", "c1", "in");
+ connect("c0", "norm", "c1", "conj");
}
~tc_1();
@@ -271,11 +283,15 @@
qa_mblock_prims::test_connect()
{
// define the protocol class
- pmt_t pc = mb_make_protocol_class(pmt_intern("data"),
// name of class
- pmt_cons(pmt_intern("data"), PMT_NIL),
// in
- PMT_NIL);
// out
+ mb_make_protocol_class(pmt_intern("data"), // name
of class
+ pmt_cons(pmt_intern("data"), PMT_NIL), // in
+ PMT_NIL); // out
+ mb_make_protocol_class(pmt_intern("i/o"), // name
of class
+ pmt_cons(pmt_intern("in"), PMT_NIL), // in
+ pmt_cons(pmt_intern("out"), PMT_NIL)); // out
+
mb_runtime_sptr rt = mb_make_runtime();
mb_mblock_sptr mb0 = mb_mblock_sptr(new tc_0());
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r3985 - gnuradio/branches/developers/eb/mb/mblock/src/lib,
eb <=