codes-mapping-context.h 3.18 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Copyright (C) 2015 University of Chicago.
 * See COPYRIGHT notice in top-level directory.
 *
 */

/* SUMMARY - data structure and utilities to direct LP mappings. As opposed to
 * the codes-mapping API, this defines metadata necessary to allow implicit
 * mappings based on LP type and configuration specification
 * (see modelnet, LSM, etc)
 * mctx stands for mapping context */

#ifndef CODES_MAPPING_CONTEXT_H
#define CODES_MAPPING_CONTEXT_H

#include <stdbool.h>
#include <ross.h>

19 20
/* for convenience - an annotation-ignoring "group_modulo" context,
 * matching previous mapping behavior in most interfaces (modelnet and such) */
21
extern struct codes_mctx const * const CODES_MCTX_DEFAULT;
22

23 24 25 26 27 28 29 30 31 32 33
/* types of map contexts */
enum codes_mctx_type {
    // instructs those using the context to map directly to an LP
    CODES_MCTX_GLOBAL_DIRECT,
    // instructs those using the context to map into the same group/repetition
    // and compute the callee offset as the modulus of the caller offset and
    // the number of callees in the group, to provide simple wraparound
    // behaviour
    CODES_MCTX_GROUP_MODULO,
    // instructs those using the context to map into the same group/repetition
    // and directly to a callee offset
34 35 36
    CODES_MCTX_GROUP_DIRECT,
    // unknown/uninitialized context
    CODES_MCTX_UNKNOWN
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
};

/* defines whether to specialize by destination annotation, and if so, which
 * one.
 *
 * NOTE: this structure does not "own" the annotation, and makes no attempt to
 * clean it up. */
struct codes_mctx_annotation {
    char const * annotation;
    bool ignore_annotations;
};

/* parameters for each mapping context type */
struct codes_mctx_global_direct {
    tw_lpid lpid;
};

struct codes_mctx_group_modulo {
    struct codes_mctx_annotation anno;
};

struct codes_mctx_group_direct {
    struct codes_mctx_annotation anno;
    int offset;
};

struct codes_mctx {
    enum codes_mctx_type type;
    union {
        struct codes_mctx_global_direct global_direct;
        struct codes_mctx_group_modulo  group_modulo;
        struct codes_mctx_group_direct  group_direct;
    } u;
};

/* simple setter functions */
struct codes_mctx codes_mctx_set_global_direct(tw_lpid lpid);

struct codes_mctx codes_mctx_set_group_modulo(
        char const * annotation,
        bool ignore_annotations);

struct codes_mctx codes_mctx_set_group_direct(
        int offset,
        char const * annotation,
        bool ignore_annotations);

/* helper function to do a codes mapping - this function is subject to change
85
 * based on what types of ctx exist
86
 * NOTE: in GLOBAL_DIRECT mode, dest_lp_name and sender_gid are ignored */
87 88 89
tw_lpid codes_mctx_to_lpid(
        struct codes_mctx const * ctx,
        char const * dest_lp_name,
90 91 92 93 94 95 96 97
        tw_lpid sender_gid);

/* helper function to extract which annotation a various map context maps to.
 * annotation is allocated or NULL if unused */
char const * codes_mctx_get_annotation(
        struct codes_mctx const *ctx,
        char const * dest_lp_name,
        tw_lpid sender_id);
98 99 100 101 102 103 104 105 106 107 108 109

#endif /* end of include guard: CODES_MAPPING_CONTEXT_H */

/*
 * Local variables:
 *  c-indent-level: 4
 *  c-basic-offset: 4
 *  indent-tabs-mode: nil
 * End:
 *
 * vim: ts=8 sts=4 sw=4 expandtab
 */