commit-gnuradio
[Top][All Lists]
Advanced

[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());
 }





reply via email to

[Prev in Thread] Current Thread [Next in Thread]