+ * A selector interface which is used by the ILP schedule framework.
+ * These functions provide the ILP scheduler with necessary information
+ * from the backend or they pass back information to the backend about
+ * the state of scheduling.
+ */
+struct _ilp_sched_selector_if_t {
+
+ /**
+ * This function is called before the scheduling of the irg.
+ * @param self The this pointer.
+ * @param irg The irg being scheduled.
+ * @return An irg scheduling environment.
+ */
+ void *(*init_irg_ilp_schedule)(const void *self, ir_graph *irg);
+
+ /**
+ * This functions is called after an irg has been scheduled.
+ * @param self The this pointer.
+ * @param irg The irg which has been scheduled.
+ * @param irg_env The irg scheduling environment.
+ */
+ void (*finish_irg_ilp_schedule)(const void *self, ir_graph *irg, void *irg_env);
+
+ /**
+ * This function is called before the scheduling of a block starts.
+ * @param self The this pointer.
+ * @param block The block being scheduled.
+ * @return A block scheduling environment.
+ */
+ void *(*init_block_ilp_schedule)(const void *self, ir_node *block);
+
+ /**
+ * This functions is called after a block has been scheduled.
+ * @param self The this pointer.
+ * @param block The block which has been scheduled.
+ * @param block_env The block scheduling environment.
+ */
+ void (*finish_block_ilp_schedule)(const void *self, ir_node *block, void *block_env);
+
+ /**
+ * Calculates the latency of node @p irn.
+ * @param self The this pointer.
+ * @param irn The node.
+ * @param block_env The block scheduling environment.
+ * @return The latency in cycles of node @p irn.
+ */
+ unsigned (*latency)(const void *self, ir_node *irn, void *block_env);
+
+ /**
+ * This function is called after a certain node has been scheduled.
+ * @param self The this pointer.
+ * @param irn The node which has been scheduled.
+ * @param cycle The cycle at which the node is scheduled.
+ * @param block_env The block scheduling environment.
+ */
+ void (*node_scheduled)(const void *self, const ir_node *irn, unsigned cycle, void *block_env);
+};
+
+/**
+ * The actual ILP schedule selector.
+ */
+struct _ilp_sched_selector_t {
+ ilp_sched_selector_if_t *impl;
+};
+
+/**
+ * Some helper macros.