--- /dev/null
+/* DOL Block Implementation */
+
+#include <stdio.h>
+#include <dol.h>
+#include "ports.h"
+
+/* DOL support functions
+ * ===================================================================== */
+int DOL_read(void *port, void *buf, int len, DOLProcess *p)
+{
+ port_t *pp = get_port(port);
+ if(!pp || !pp->read) return 0;
+
+ return(pp->read(buf, len));
+}
+
+int DOL_write(void *port, void *buf, int len, DOLProcess *p)
+{
+ port_t *pp = get_port(port);
+ if(!pp || !pp->write) return 0;
+
+ return(pp->write(buf, len));
+}
+
+int DOL_rtest(void *port, int len, DOLProcess *p)
+{
+ /* check if channel contains at least 'len' bytes */
+ port_t *pp = get_port(port);
+ if(!pp || !pp->level) return 0;
+
+ int level = pp->level();
+ return (level >= len) ? 1 : 0;
+}
+
+int DOL_wtest(void *port, int len, DOLProcess *p)
+{
+ /* check if channel has space for at least 'len' bytes */
+ port_t *pp = get_port(port);
+ if(!pp || !pp->level) return 0;
+
+ int level = pp->level();
+ return (level < (pp->size() - len)) ? 1 : 0;
+}
+
+void DOL_detach(DOLProcess *p)
+{
+ p->wptr->active = 0;
+ return;
+}
+
+int DOL_get_index(int dim, DOLProcess *p)
+{
+ if((dim < 0) || (dim > 4)) return(-1);
+
+ return(p->wptr->instance[dim]);
+}
+
+char* DOL_create_port(char* port, char* base, int ndim, int index0, int range0,
+ int index1, int range1, int index2, int range2, int index3, int range3)
+{
+ /* hang on invalid input */
+ if(range0 && (index0 >= range0)) while(1);
+ if(range1 && (index1 >= range1)) while(1);
+ if(range2 && (index2 >= range2)) while(1);
+ if(range3 && (index3 >= range3)) while(1);
+
+ switch(ndim) {
+ case 1:
+ snprintf(port, PORTNAME_MAXLEN-1,
+ "%s_%i", base, index0);
+ port[PORTNAME_MAXLEN-1] = '\0';
+ break;
+ case 2:
+ snprintf(port, PORTNAME_MAXLEN-1,
+ "%s_%i_%i", base, index0, index1);
+ port[PORTNAME_MAXLEN-1] = '\0';
+ break;
+ case 3:
+ snprintf(port, PORTNAME_MAXLEN-1,
+ "%s_%i_%i_%i", base, index0, index1, index2),
+ port[PORTNAME_MAXLEN-1] = '\0';
+ break;
+ case 4:
+ snprintf(port, PORTNAME_MAXLEN-1,
+ "%s_%i_%i_%i_%i", base, index0, index1, index2, index3);
+ port[PORTNAME_MAXLEN-1] = '\0';
+ break;
+ default:
+ while(1);
+ }
+
+ return(port);
+}
+